使用表单请求特定的自定义验证属性

时间:2015-07-07 10:16:29

标签: laravel laravel-5 laravel-validation

使用Laravel的本地化(http://laravel.com/docs/5.1/localization)我创建了一些自定义验证属性以提供更友好的验证错误(例如,'First Name'而不是名字等)。

我正在使用表单请求(http://laravel.com/docs/5.1/validation#form-request-validation)以验证用户提交,并且在某些情况下我想提供特定于商店的自定义验证属性(例如,我可能有一个'name'字段,在一个上下文中是品牌名称,在另一个上下文中是产品名称。

messages()方法允许我指定特定于验证规则的消息覆盖,但这并不理想,因为它不是我们需要覆盖的验证消息,只需要覆盖属性名称(例如,如果我们有5个验证) “电子邮件”的规则,我们必须在这里提供5个覆盖,而不是一个覆盖,比如说,客户电子邮件)。

有解决方案吗?我注意到Laravel文档中对formatValidationErrors()和formatErrors()的引用,但实际上并没有关于如何正确覆盖这些内容的任何信息,而且我没有太多运气。

2 个答案:

答案 0 :(得分:8)

您可以覆盖属性名称,默认为字段名称。

使用表单请求

在表单请求类中覆盖attributes()方法:

public function attributes()
{
    return [
        'this_is_my_field' => 'Custom Field'
    ];
}

使用控制器或自定义验证

您可以使用第4个参数覆盖字段名称:

$this->validate($request, $rules, $messages, $customAttributes);

Validator::make($data, $rules, $messages, $customAttributes);

简单的工作示例

Route::get('/', function () {
    // The data to validate
    $data = [
        'this_is_my_field' => null
    ];

    // Rules for the validator
    $rules = [
        'this_is_my_field' => 'required',
    ];

    // Custom error messages
    $messages = [
        'required' => 'The message for :attribute is overwritten'
    ];

    // Custom field names
    $customAttributes = [
        'this_is_my_field' => 'Custom Field'
    ];

    $validator = Validator::make($data, $rules, $messages, $customAttributes);

    if ($validator->fails()) {
        dd($validator->messages());
    }

    dd('Validation passed!');
});

答案 1 :(得分:3)

正如我的问题所详述,我一直在寻找一种方法来提供具有自定义属性名称的特定表单请求存储(http://laravel.com/docs/5.1/validation#form-request-validation)。

Laravel文档仅涵盖了此上下文中的两个Requests方法 - rules()和authorize()。我知道有一个messages()方法来提供特定于验证的自定义错误消息,但它也会出现一个attribute()方法,它完全符合我的要求:

public function attributes()
{
     return [
         'name' => 'Product Name'
     ]
}

这会覆盖我商店上下文中的属性名称。