如何从Validator :: extend()向Validator :: replacer()发送数据,以便我的消息更详细?

时间:2017-05-26 21:01:17

标签: validation laravel-5 httpresponse

我使用自定义验证程序验证csv的内容,以确保行和单元格都有效。当我发现错误时 - 我希望消息具体。有没有办法从Validator :: extend()发送信息到Validator :: replacer()?

不幸的是我的公司infra不好,所以我没有会话或redis或任何东西。纯php / laravel解决方案。

1 个答案:

答案 0 :(得分:0)

您需要将validation()和replacer()放在一起,然后使用该类的属性在它们之间传递数据。这是一个简单的部分。但是,该类必须是工厂生成的单例,因为如果它不是,那么对validate()的调用和对replacer()的调用将分别获得它们自己的实例,并且每次属性都是新的。

在App \ Providers \ AppServiceProvider.php中添加类似这样的内容到boot()方法。

Validator::extend('myRuleName', 'App\Validators\MyCustomValidatorClass@validate');
Validator::replacer('myRuleName', 'App\Validators\MyCustomValidatorClass@message');

相同的AppServiceProvider文件,在register()方法中。强制laravel始终通过使其成为单例来加载验证器的同一实例。这是拥有$ persistant_info的关键。

$this->app->singleton(\App\Validators\MyCustomValidatorClass::class, function(){
        return new \App\Validators\MyCustomValidatorClass;
    });

现在在app / Validators中创建你的MyCustomValidatorClass.php吧......

namespace App\Validators;

class MyCustomValidatorClass{

private $persistant_info = 'Foo';

public function validate($attribute, $value, $parameters, $validator){
    $this->persistant_info = 'Bar';
    return false;//normal true/false validation of $value
}

public function message($message, $attribute, $rule, $parameters){
    return $this->persistant_info; //returns Bar
}

}