web-dev-qa-db-fra.com

Laravel: la validation d'un nombre supérieur à zéro échoue

Je dois valider un champ de prix qui doit être supérieur à zéro (0,01 est valide), j'ai donc la validation suivante:

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);

Le problème est que lorsque j'entre une chaîne dans le champ 'product_price', j'obtiens une erreur:

InvalidArgumentException Les valeurs sous comparaison doivent être du même type

pourquoi donc? Je veux dire, je vérifie qu'il doit être numérique avant même de vérifier qu'il est> 0

8
MrCujo

gt, gte, lt et lte sont ajoutés dans Laravel 5.6 et versions ultérieures, je suppose que doit être la raison pour laquelle vous obtenez l'erreur. (Cela fonctionne pour moi cependant.)

Je pense que tu peux essayer comme ça

$request->validate([
    'product_price' => 'required|numeric|min:0|not_in:0',
]);

min:0 assurez-vous que la valeur minimale est 0 et qu'aucune valeur négative n'est autorisée. not_in:0 assurez-vous que la valeur ne peut pas être 0. Ainsi, la combinaison de ces deux règles fait le travail.

Vous pouvez définir des messages d'erreur significatifs pour certaines règles. (Vous pouvez également obtenir le même résultat en utilisant des expressions régulières.)

28
TharinduLucky

Vous pouvez essayer de cette façon,

Avant d'appeler la fonction Validator :: make (), modifiez l'ensemble de règles en ajoutant la valeur à comparer comme ceci:

use Illuminate\Support\Facades\Validator;

Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
      return intval($value) > intval($otherValue[0]);
});

$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);
2
Mayank Majithya

Pour moi, ce code fonctionne dans mon projet.

$validation_rules = array( 
                'user_id' => 'required|integer|gt:0',
                'type_id' => 'required|integer|gt:0',
            );
$validation = Validator::make($request->all(), $validation_rules);

Ici, gt: 0 vérifie si l'entier est supérieur à zéro.

J'espère que cela fonctionnera pour vous. Sinon, veuillez vérifier votre version Laravel.

1
Chandan Sharma

Je peux voir qu'aucune des autres réponses n'a vraiment abordé la vraie raison pour laquelle vous obtenez cette erreur, je vais essayer de fournir quelques idées et une solution.

Le problème ici est que Laravel teste toutes les règles de validation et ne s'arrête pas après la première erreur de validation qui dans votre cas est numeric (qui échoue car la valeur fournie est une chaîne)) , si c'était le cas, l'erreur avec le validateur gt étant fournie une valeur de chaîne ne serait pas levée puisque le validateur est déjà sorti après l'erreur numeric.

Pour que Laravel arrête les vérifications de validation après la première règle de validation ayant échoué, vous pouvez préfixer vos règles de validation avec le validateur bail qui indique essentiellement Laravel = pour s'arrêter après la première erreur.

Le code résultant ressemblerait à ceci:

$request->validate([
    'product_price' => 'bail|required|numeric|gt:0',
]);

Notez que cette solution permet également de ne renvoyer qu'une seule erreur par champ, si dans votre interface utilisateur vous affichez généralement toutes les erreurs pour un champ particulier à la fois (au lieu de ne sélectionner que la première dans le sac de messages), cette solution changerait cela.

Plus d'informations sur la règle de validation bail peuvent être trouvées ici: https://laravel.com/docs/6.x/validation#rule-bail

0
effy