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

Using form request specific custom validation attributes

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

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

messages() 方法允许我指定验证规则特定的消息覆盖,但这并不理想,因为它不是我们需要覆盖的验证消息,只是属性名称(例如,如果我们有'email' 的 5 条验证规则,我们必须在此处提供 5 条覆盖,而不是针对客户电子邮件的 1 条覆盖。

有解决办法吗?我在 Laravel 文档中注意到了对 formatValidationErrors() 和 formatErrors() 的引用,但实际上并没有任何关于如何正确覆盖它们的信息,而且我在尝试时运气不佳。

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

有表单请求

在您的表单请求中 class 覆盖 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!');
});

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

Laravel 文档仅介绍了此上下文中请求的两种方法 - rules() 和 authorize()。我知道有一个 messages() 方法可以提供特定于验证的自定义错误消息,但似乎还有一个 attributes() 方法,它完全符合我的要求:

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

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