Come convalidare l'array in Laravel?


105

Provo a convalidare il POST dell'array in Laravel:

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

        ]);

Invio POST vuoto e ottengo questo if ($validator->fails()) {}come False. Significa che la convalida è vera, ma non lo è.

Come convalidare l'array in Laravel? Quando invio il modulo coninput name="name[]"

Risposte:


239

Il simbolo asterisco (*) viene utilizzato per controllare i valori nell'array, non l'array stesso.

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

Nell'esempio sopra:

  • "nomi" devono essere un array con almeno 3 elementi,
  • i valori nella matrice "nomi" devono essere stringhe distinte (univoche), lunghe almeno 3 caratteri.

EDIT: da Laravel 5.5 puoi chiamare il metodo validate () direttamente sull'oggetto Request in questo modo:

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

ricordati di metterlo in un tentativo di cattura se lo stai usando $request->validate([...]). Verrà sollevata un'eccezione se i dati falliscono la convalida.
daisura99

come ottenere il messaggio di errore di un campo specifico? come se avessi 2 campi di nome, e poi è il secondo campo che ha solo l'errore, come posso ottenerlo?
Eem Jee

38

Ho questo array come dati di richiesta da una griglia / tabella di dati HTML + Vue.js:

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

E usalo per convalidare quale funziona correttamente:

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

2
Questo è esattamente il tipo di cosa di cui avevo bisogno!
Chris Stage

17

Il modo consigliato per scrivere la logica di convalida e autorizzazione è inserire tale logica in classi di richiesta separate. In questo modo il codice del controller rimarrà pulito.

È possibile creare una classe di richiesta eseguendo php artisan make:request SomeRequest.

In ogni rules()metodo della classe di richiesta, definisci le tue regole di convalida:

//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
    ]
  ];
}

Nel tuo controller scrivi la tua funzione di rotta in questo modo:

// SomeController.php
public function store(SomeRequest $request) 
{
  // Request is already validated before reaching this point.
  // Your controller logic goes here.
}

public function update(SomeRequest $request)
{
  // It isn't uncommon for the same validation to be required
  // in multiple places in the same controller. A request class
  // can be beneficial in this way.
}

Ogni classe di richiesta viene fornita con hook / metodi pre e post-convalida che possono essere personalizzati in base alla logica aziendale e a casi speciali per modificare il normale comportamento della classe di richiesta.

È possibile creare classi di richiesta padre per tipi simili di richieste (ad esempio webe api) richieste e quindi incapsulare una logica di richiesta comune in queste classi padre.


6

Dati un po 'più complessi, mix di risposte di @ Laran e @Nisal Gunawardana

[ 
   {  
       "foodItemsList":[
    {
       "id":7,
       "price":240,
       "quantity":1
                },
               { 
                "id":8,
                "quantity":1
               }],
        "price":340,
        "customer_id":1
   },
   {   
      "foodItemsList":[
    {
       "id":7,
       "quantity":1
    },
    { 
        "id":8,
        "quantity":1
    }],
    "customer_id":2
   }
]

La regola di convalida sarà

 return [
            '*.customer_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];

4

È necessario eseguire il ciclo sull'array di input e aggiungere regole per ogni input come descritto qui: Loop Over Rules

Ecco un codice per te:

$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 */ 
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.