5

Laravel 5 の FormRequests は、検証と承認のための優れたアプローチです。しかし、1対多の関係のデータを含むリクエストを検証する必要がある場合は、どうすればよいですか。たとえば、単純な請求書アプリがあるとします。1 つの請求書には多くのサービスが含まれています。私のフォーム投稿リクエストには、次のデータが含まれています。

 array (size=5)
  'date' => string '2014-11-14' (length=10)
  'num' => string '175' (length=3)
  'client_id' => string '5' (length=1)
  'vat' => string '1' (length=1)
  'services' => 
    array (size=2)
      0 => 
        array (size=3)
          'description' => string 'Service 1' (length=36)
          'value' => string '10' (length=2)
          'items' => string '2' (length=1)
      1 => 
        array (size=3)
          'description' => string 'Service 2' (length=11)
          'value' => string '20' (length=2)
          'items' => string '2' (length=1)

InvoiceFormRequest クラスで請求書データを検証できるようになりましたが、サービスを続行する方法は次のとおりです。

<?php namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Response;

class InvoiceFormRequest extends FormRequest
{
    public function rules()
    {
        return [
            'date' => 'required',
            'num' => 'required',
            'client_id' => 'required',
            'vat' => 'required'
        ];
    }

    public function authorize()
    {
        return true;
    }
}

前もって感謝します!


更新: Laravel 5.2でここで読んだように、次のようなものを書くことができます:

'services.*.description' => 'required',
'services.*.value' => 'required:numeric',
'services.*.items' => 'required:integer'
4

3 に答える 3

2

Laravel 5.2 では、配列の検証が行われました。

'services.*.description' => 'required',
'services.*.value' => 'required:numeric',
'services.*.items' => 'required:integer'

http://laravel.com/docs/5.2/releases#laravel-5.2

于 2015-12-19T20:47:42.607 に答える
1

ルールの「services」パラメーターに「array」オプションを使用することもできますが、もちろん、これは各要素に含まれるデータを検証しません。

http://laravel.com/docs/master/validation#rule-array

したがって、マーウェルが言ったようなものを、カスタムバリデータと「配列」ルールで使用することをお勧めします。

あなたのルールはおそらく次のようになります

public function rules()
{
    return [
        'date' => 'required',
        'num' => 'required',
        'client_id' => 'required',
        'vat' => 'required',
        'services' => 'array|services'
    ];
}

カスタムバリデータは次のようになります(これをServiceProviderに配置する必要があります)

Validator::extend('services', function($attribute, $value, $parameters)
{

    //foreach $value as $service
          //validate $service['description'], $service['value'], $service['items']

    //return true or false depending on the validation of each element
});

正しい方向性を見つけるのに役立つことを願っています!

于 2014-11-27T11:42:16.447 に答える