170 votes

Comment valider un tableau à Laravel?

J'essaie de valider le tableau POST à Laravel:

 $validator = Validator::make($request->all(), [
            "name.*" => 'required|distinct|min:3',
            "amount.*" => 'required|integer|min:1',
            "description.*" => "required|string"

        ]);
 

J'envoie un POST vide et reçois ce if ($validator->fails()) {} sous forme de False . Cela signifie que la validation est vraie, mais ce n'est pas.

Comment valider un tableau à Laravel? Lorsque je soumets un formulaire avec input name="name[]"

397voto

Laran Points 1806

Le symbole astérisque (*) signifie que vous souhaitez vérifier les valeurs dans le tableau, pas dans le tableau.

 $validator = Validator::make($request->all(), [
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);
 

Dans l'exemple ci-dessus:

  • "Nom" doit être un tableau avec au moins 3 éléments.
  • Les valeurs du tableau "name" doivent être des chaînes distinctes (uniques) d'au moins 3 caractères.

EDIT: Depuis Laravel 5.5, vous pouvez appeler la méthode validate () directement sur l’objet Request de la manière suivante:

 $data = $request->validate([
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);
 

73voto

Nisal Gunawardana Points 268

J'ai ce tableau en tant que ma demande de données à partir d'un tableau / grille de données HTML + Vue.js:

 [0] => Array
    (
        [item_id] => 1
        [item_no] => 3123
        [size] => 3e
    )
[1] => Array
    (
        [item_id] => 2
        [item_no] => 7688
        [size] => 5b
    )
 

Et utilisez ceci pour valider ce qui fonctionne correctement:

 $this->validate($request, [
    '*.item_id' => 'required|integer',
    '*.item_no' => 'required|integer',
    '*.size'    => 'required|max:191',
]);
 

31voto

sumit Points 520

Recommandé façon d'écrire à la validation et à l'autorisation de la logique est de mettre de la logique dans la demande distincte des classes. De cette façon, votre code de contrôleur restera propre.

vous pouvez créer une classe de requête par l'exécution de l' php artisan make:request SomeRequest

à la Demande de la classe des règles de() la méthode de définir vos règles de validation

//SomeRequest.php
public function rules()
{
   return [
    "name"    =>[
          'required',
          'array', //input must be an array
          'min:3'//there must be three members in the array
     ],
    "name.*"  => [
          'required',
          'string',//input must be of type string
          'distinct',//members of the array must be unique
          'min:3'//each string must have min 3 chars
     ]
  ];
}

dans votre contrôleur écrire votre itinéraire en fonction comme ceci

public function someFunction(SomeRequest $request) 
{
  //request is already validated before reaching this point
  //your controller logic goes here
}

Demande de la classe est livré avec pré et post-validation des crochets ou des méthodes qui peuvent être personnalisés basés sur la logique métier et des cas particuliers afin de modifier le comportement normal de demander de classe.

Vous pouvez créer Parent Demande des classes pour le même type de demandes, par exemple pour le web et les demandes d'api et puis encapsuler des communes de demande de logique dans ces classes parentes.

3voto

Chad Fisher Points 217

Vous devez parcourir le tableau d'entrée et ajouter des règles pour chaque entrée, comme décrit ci-après: Règles de bouclage

Voici un code pour toi:

 $input = Request::all();
$rules = [];

foreach($input['name'] as $key => $val)
{
    $rules['name.'.$key] = 'required|distinct|min:3';
}

$rules['amount'] = 'required|integer|min:1';
$rules['description'] = 'required|string';

$validator = Validator::make($input, $rules);

//Now check validation:
if ($validator->fails()) 
{ 
  /* do something */ 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X