2017-02-18 2 views
1

J'ai eu un problème avec les règles de validation des conditions imbriquées.Les règles de validation required_if avec une autre condition (Laravel 5.4)

class StoreRequest extends Request 
{ 
     public function authorize(){ 
     return true; 
     } 

     public function rules(){ 
       return [ 
        'type_id'  => 'required|integer', 
        'external_id' => 'required_if:type_id,==,3|integer', 
       ]; 
     } 
} 

En effet, je veux: - vérifiez la external_id que si le type_id égal à 3 - et vérifier si elle est un entier.

Lorsque je poste ma forme, les règles fonctionne lorsque je sélectionne un type_id égal à 3. Mais si je sélectionne une autre type_id, comme 1 ou 2, la validation ne passe pas:

Le external_id doit être un entier.

J'essaie d'ajouter la condition annulable mais required_if ne fonctionne plus

Avez-vous une idée?

Répondre

2

Votre règle effectue deux contrôles indépendants les uns des autres; juste parce que le champ external_id n'est pas nécessaire lorsque le type_id! = 3, ne signifie pas que le contrôle entier est ignoré.

Ce que vous cherchez est un conditional rule, ce qui vous donne un contrôle plus précis de quand effectuer une vérification, par exemple :

$validator = Validator::make($data, [ 
    'type_id' => 'required|integer' 
]); 

$validator->sometimes('external_id', 'required|integer', function($input) { 
    return $input->type_id == 3; 
}); 

Lorsque vous utilisez la validation du formulaire, vous pouvez accéder à l'instance de validateur sous-jacente en redéfinissant la méthode getValidatorInstance():

class StoreRequest extends Request 
{ 
     public function authorize(){ 
     return true; 
     } 

     public function rules(){ 
       return [ 
        'type_id'  => 'required|integer' 
       ]; 
     } 

     protected function getValidatorInstance() { 
      $validator = parent::getValidatorInstance(); 
      $validator->sometimes('external_id', 'required|integer', function($input) { 
       return $input->type_id == 3; 
      }); 
      return $validator; 
     } 
} 
0

essayer cela,

class StoreRequest extends Request 
    { 
      public function authorize(){ 
      return true; 
      } 

      public function rules(){ 
        return [ 
         'type_id'  => 'required|integer', 
         'external_id' => 'required_if:type_id|in:3|integer', 
        ]; 
      } 
    } 
0

Juste suis tombé sur le même problème et trouvé la réponse suivante qui semble fonctionner pour moi:

issue-using-required-if-validation-rule-in-form-builder

 return [ 
       'type_id'  => 'required|integer', 
       'external_id' => 'required_if:type_id,==,3|nullable|integer', 
      ]; 

Résultat pour moi:

champ non peuplé, le type id pas 3 - passer

champ non peuplé, le type id 3 - échec - champ obligatoire

champ

peuplé , type id 3, non entier - échec dans la règle entière

zone remplie, type id 3, entier - pa ss - tout va bien! Note - pense que la règle nullable est venue dans Laravel 5.3