Laravel 5 表单请求 - 验证相关数据

5

Laravel 5中的FormRequests是验证和授权的好方法。 但是如果我必须验证包含一对多关系数据的请求,该怎么办呢? 例如,如果我有一个简单的发票应用程序。 一个发票有很多服务。 我的表单提交请求包含以下数据:

 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'

你需要使用自定义验证器。如果你想在 FormRequest 中使用自定义验证器,请参考这里 - Marwelln
你的更新应该是一个答案。 - whoan
好的,我会做。现在是事实。Laravel 5.2 刚刚发布了。 - fireball70
3个回答

2

1
您可以在规则的“服务”参数中使用“array”选项,但这当然不会验证每个元素中包含的任何数据。

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

因此,我建议使用Marwelln所说的自定义验证器和“array”规则。

您的规则可能会像这样:

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

自定义验证器可以像这样(需要将此代码放在服务提供者中):

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
});

希望它能帮助你找到正确的方向!(保留HTML格式)

0
或许有一种更自动化的方式来实现这个方法:
Validator::extend('ingredients', function($attribute, $value, $parameters)
{
    $model = app("App\Models\\".Str::singular(Str::studly($attribute)));
    return Validator::make($value, $model::$rules)->validate();
});

刚刚编辑过,两次,1:一个解决方案,2:也想要一些更多信息。 - AlanSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接