Laravelで配列POSTを検証します。
$validator = Validator::make($request->all(), [
"name.*" => 'required|distinct|min:3',
"amount.*" => 'required|integer|min:1',
"description.*" => "required|string"
]);
空のPOSTを送信し、このif ($validator->fails()) {}
をFalse
として取得します。これは検証が真実であることを意味しますが、そうではありません。
Laravelで配列を検証する方法input name="name[]"
を付けてフォームを送信すると
アスタリスク記号(*)は、実際の配列ではなく、配列内のVALUESをチェックしたいことを意味します。
$validator = Validator::make($request->all(), [
"name" => "required|array|min:3",
"name.*" => "required|string|distinct|min:3",
]);
上記の例では:
EDIT: Laravel 5.5以降、Requestオブジェクトに対して直接validate()メソッドを呼び出すことができます。
$data = $request->validate([
"name" => "required|array|min:3",
"name.*" => "required|string|distinct|min:3",
]);
私はこの配列をHTML + Vue.jsデータグリッド/テーブルからの私のリクエストデータとして持っています:
[0] => Array
(
[item_id] => 1
[item_no] => 3123
[size] => 3e
)
[1] => Array
(
[item_id] => 2
[item_no] => 7688
[size] => 5b
)
そしてこれを使ってどれが正しく動作するかを検証します。
$this->validate($request, [
'*.item_id' => 'required|integer',
'*.item_no' => 'required|integer',
'*.size' => 'required|max:191',
]);
検証と承認のロジックを書くための推奨される方法は、そのロジックを別々のリクエストクラスに入れることです。こうすればあなたのコントローラーコードはきれいに残る。
php artisan make:request SomeRequest
を実行することでリクエストクラスを作成できます
requestクラスのrules()メソッドであなたの検証ルールを定義します
//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
]
];
}
あなたのコントローラでこのようにあなたのルート関数を書いてください
public function someFunction(SomeRequest $request)
{
//request is already validated before reaching this point
//your controller logic goes here
}
リクエストクラスには、リクエストクラスの通常の振る舞いを変更するためにビジネスロジックや特別なケースに基づいてカスタマイズできるプリバリデーションフックやポストバリデーションフック/メソッドが付属しています。
あなたは例えばwebやapiリクエストのための類似したタイプのリクエストのためにParent Requestクラスを作成し、そしてこれらの親クラスの中にいくつかの共通のリクエストロジックをカプセル化することができます。
ここで説明しているように、入力配列をループ処理して各入力のルールを追加する必要があります。 Loop Over Rules
これがyaのコードです。
$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 */
}