Laravel 5表单请求属性不能使用自定义验证器的好名称

RMK*_*147 2 validation request laravel laravel-5 laravel-validation

在我的一个表单请求中,我有以下代码更改验证消息的输入字段的名称:

   public function attributes(){

        return [
            'title' => 'topic title',
            'content' => 'post content'
        ];

    }
Run Code Online (Sandbox Code Playgroud)

现在我想添加自定义验证规则,因此我创建了一个自定义验证服务:

class Validation extends Validator{

    public function validateFoo($attribute, $value, $parameters){

        return $value == 'foo';

    }

}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个验证服务提供程序并添加了此引导方法:

public function boot(){

    Validator::resolver(function($translator, $data, $rules, $messages)
    {
        return new Validation($translator, $data, $rules, $messages);
    });

}
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到app/config/app.php中的providers数组中:

  'App\Providers\ValidationServiceProvider',
Run Code Online (Sandbox Code Playgroud)

现在这一切都运行良好,我可以按预期在表单请求中使用我的自定义验证规则.问题是我为之前的属性设置的好名称还原为旧名称,因此不需要像"帖子标题字段是必需的"那样.我得到'标题字段是必需的'.如果我从providers数组中删除上面的条目,那么我得到了预期的好名字,但后来我不能使用我的自定义验证规则.我知道我可以在语言文件中全局看到这些,但我宁愿这样做.有没有什么办法解决这一问题?谢谢!

UPDATE

如果我只是将以下代码添加到AppServiceProvider类中,而不是执行上述操作,那么我会得到预期的属性名称,但我更喜欢第一种方式,因为它更干净:

public function boot()
{
    \Validator::extend('foo', function($attribute, $value, $parameters)
    {
        return $value == 'foo';
    });
}
Run Code Online (Sandbox Code Playgroud)

sho*_*ild 5

如果您不想为此目的使用resources/lang/en/validation.php文件,可以将ValidationServiceProvider的引导功能更改为

    public function boot()
    {
        Validator::resolver(function($translator, $data, $rules, $messages, $attributes)
        {
            return new ValidatorExtended($translator, $data, $rules, $messages, $attributes);
        });
    }
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了额外的$ attributes参数.然后,您可以像以前一样在FormRequest类中设置"nice"名称.

   public function attributes(){

    return [
        'title' => 'topic title',
        'content' => 'post content'
    ];

   }
Run Code Online (Sandbox Code Playgroud)