web-dev-qa-db-ja.com

Laravel 5-必要に応じて配列を検証しますが、空の配列を渡すことができます

私はLaravel 5.4でバリデーターでリクエストを検証しています。ドキュメントを参照してください: https://laravel.com/docs/5.4/validation#validating-arrays

基本的には、コントローラーの次のコードです。

public function createSomeResource(Request $request)
{
    $this->validate($request, [
        'items' => 'required',
    ];
    ...
}

私はフィールド「items」の存在を要求しますが、このコードはそれを行いますが、問題は「items」フィールドが空の配列である場合に検証が失敗することです。

{
    "fields": []
}

、これは望ましくない動作です。これが「必須」パラメータの文書化された動作であることは知っていますが、「クリーン」な回避策は見当たりません。私も試しました:

public function createSomeResource(Request $request)
{
    $this->validate($request, [
        'items' => 'required_unless:items,[]',
    ];
    ...
}

しかし、ドキュメントでは「required_unless」句の後の別のフィールドで機能すると書かれているため、同様に失敗しますが、完全にはわかりません。

空の配列を禁止せずに、フィールド「アイテム」の存在を要求する方法を提案してもらえますか?

編集:私の頭に浮かんだもう1つの「明白な」アプローチは、「present | array」ルールを使用することであり、ほとんど私が望むことを行いますが、残念ながら空の文字列も検証ルールを通過します。 Laravel、そうではないかもしれません-私はLaravel= githubリポジトリで問題を開きました: https://github.com/laravel/framework/issues/18948

12
Rafael K.

これを試して:

public function createSomeResource(Request $request)
{
    $this->validate($request, [
        'items' => 'present|array',
    ];
    ...
}
25
silentavt

試してください:

public function createSomeResource(Request $request)
{
    $this->validate($request, [
        'items' => 'required|array|min:1',
    ];
    ...
}

From Laravel doc:

min:value検証中のフィールドには最小値が必要です。文字列、数値、配列、およびファイルは、サイズ規則と同じ方法で評価されます。

4
ImLeo

ここでバディに行きます...

public function createSomeResource(Request $request)
{
    $validate_us_pls = [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];


    if( !empty($request->get('items')) ){
        $validate_us_pls['items'] = 'required';
    }

    $this->validate($request, $validate_us_pls);

}
2
Kabelo Tooka

おそらくこれは動作するはずです

public function rules()
{
   return [
    "items"    => "required|array|min:0",
    "items.*"  => "required|string|distinct|min:0",
  ];
}
0
sumit

たぶんこれは便利でしょうか?

配列のサイズはcountを使用します

 'ids'=>'present|array|size:1'

またはこれ

'users' => 'required|array|between:2,4'
0