web-dev-qa-db-ja.com

Laravelで配列を検証する方法

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[]"を付けてフォームを送信すると

64
Darama

アスタリスク記号(*)は、実際の配列ではなく、配列内のVALUESをチェックしたいことを意味します。

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

上記の例では:

  • "Name"は少なくとも3つの要素を持つ配列でなければなりません。
  • "name"配列内の値は、少なくとも3文字の長さの異なる(一意の)文字列でなければなりません。

EDIT: Laravel 5.5以降、Requestオブジェクトに対して直接validate()メソッドを呼び出すことができます。

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

私はこの配列を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',
]);
14

検証と承認のロジックを書くための推奨される方法は、そのロジックを別々のリクエストクラスに入れることです。こうすればあなたのコントローラーコードはきれいに残る。

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クラスを作成し、そしてこれらの親クラスの中にいくつかの共通のリクエストロジックをカプセル化することができます。

5
sumit

ここで説明しているように、入力配列をループ処理して各入力のルールを追加する必要があります。 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 */ 
}
1
Chad Fisher