Próbuję sprawdzić poprawność tablicy POST w Laravel:
$validator = Validator::make($request->all(), [
"name.*" => 'required|distinct|min:3',
"amount.*" => 'required|integer|min:1',
"description.*" => "required|string"
]);
Wysyłam pusty POST i odbieram if ($validator->fails()) {}
jako False
. Oznacza to, że walidacja jest prawdziwa, ale tak nie jest.
Jak zweryfikować macierz w Laravel? Kiedy przesyłam formularz zinput name="name[]"
php
laravel
laravel-5.4
Darama
źródło
źródło
$request->validate([...])
. Wyjątek zostanie zgłoszony, jeśli dane nie przejdą weryfikacji.Mam tę tablicę jako dane żądania z siatki / tabeli danych HTML + Vue.js:
[0] => Array ( [item_id] => 1 [item_no] => 3123 [size] => 3e ) [1] => Array ( [item_id] => 2 [item_no] => 7688 [size] => 5b )
I użyj tego, aby sprawdzić, który działa poprawnie:
$this->validate($request, [ '*.item_id' => 'required|integer', '*.item_no' => 'required|integer', '*.size' => 'required|max:191', ]);
źródło
Zalecanym sposobem zapisu logiki walidacji i autoryzacji jest umieszczenie tej logiki w oddzielnych klasach żądań. W ten sposób kod kontrolera pozostanie czysty.
Możesz utworzyć klasę żądania, wykonując
php artisan make:request SomeRequest
.W
rules()
metodzie każdej klasy żądania zdefiniuj swoje reguły walidacji://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 ] ]; }
W kontrolerze napisz funkcję trasy w ten sposób:
// 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. }
Każda klasa żądania zawiera zaczepy / metody przed i po walidacji, które można dostosować w oparciu o logikę biznesową i przypadki specjalne w celu zmodyfikowania normalnego zachowania klasy żądania.
Możesz utworzyć nadrzędne klasy żądań dla podobnych typów żądań (np.
web
Iapi
) żądań, a następnie zawrzeć pewną wspólną logikę żądań w tych klasach nadrzędnych.źródło
Trochę bardziej złożone dane, mieszanka odpowiedzi @ Laran i @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 } ]
Reguła walidacji będzie
return [ '*.customer_id' => 'required|numeric|exists:customers,id', '*.foodItemsList.*.id' => 'required|exists:food_items,id', '*.foodItemsList.*.quantity' => 'required|numeric', ];
źródło
Musisz zapętlić tablicę wejściową i dodać reguły dla każdego wejścia, jak opisano tutaj: Reguły pętli
Oto kod dla ciebie:
$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 */ }
źródło