web-dev-qa-db-fra.com

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 vide POST et j'obtiens ceci if ($validator->fails()) {} comme False. Cela signifie que la validation est vraie, mais ce n'est pas le cas.

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

74
Darama

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",
]);
164
Laran

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',
]);
19
Nisal Gunawardana

La méthode recommandée pour écrire la logique de validation et d’autorisation consiste à la placer dans des classes de demande distinctes. De cette façon, votre code de contrôleur restera propre.

vous pouvez créer une classe de requête en exécutant php artisan make:request SomeRequest

dans la méthode rules () de la classe Request, définissez 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 fonction de route comme ça

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

La classe de demandes est fournie avec des méthodes/crochets pré et post-validation qui peuvent être personnalisés en fonction de la logique applicative et de cas particuliers afin de modifier le comportement normal de la classe de demandes.

Vous pouvez créer des classes de demande parente pour des requêtes de type similaire, par exemple pour des requêtes Web et API, puis encapsuler une logique de requête commune dans ces classes parentes.

6
sumit

Vous devez boucler sur le tableau d’entrée et ajouter des règles pour chaque entrée comme décrit ici: 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 */ 
}
1
Chad Fisher