Laravelでアレイを検証する方法は?


104

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[]"

回答:


238

アスタリスク記号(*)は、配列自体ではなく、配列のをチェックするために使用されます。

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

上記の例では:

  • 「names」は、少なくとも3つの要素を持つ配列である必要があります。
  • 「names」配列のは、3文字以上の別個の(一意の)文字列である必要があります。

編集: Laravel 5.5以降では、次のようにRequestオブジェクトでvalidate()メソッドを直接呼び出すことができます。

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

を使用して$request->validate([...])いる場合は、必ずtry catchに配置してください。データが検証に失敗した場合、例外が発生します。
daisura99 2018年

特定のフィールドのエラーメッセージを取得する方法 名前の2つのフィールドがあり、エラーのみが含まれる2番目のフィールドのように、どうすればそれを達成できますか?
Eem Jee、

38

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

2
これはまさに私が必要としていたものです。
クリスステージ

17

検証と承認のロジックを作成するための推奨される方法は、そのロジックを個別のリクエストクラスに配置することです。このようにして、コントローラーコードはクリーンなままになります。

を実行してリクエストクラスを作成できますphp artisan make:request SomeRequest

各リクエストクラスの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
    ]
  ];
}

コントローラで、次のようにルート関数を記述します。

// 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.
}

各リクエストクラスには、リクエストクラスの通常の動作を変更するために、ビジネスロジックと特殊なケースに基づいてカスタマイズできる検証前と検証後のフック/メソッドが付属しています。

類似のタイプのリクエスト(webおよびapi)リクエストの親リクエストクラスを作成し、これらの親クラスにいくつかの一般的なリクエストロジックをカプセル化できます。


6

少し複雑なデータ、@ Laranの回答と@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
   }
]

検証ルールは

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

4

ここで説明するように、入力配列をループして、各入力のルールを追加する必要があります:ループオーバールール

これが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 */ 
}

9
それを行う必要はありません-laravel.com/docs/5.4/validation#validating-arrays
Filip Sobol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.