我使用自定义验证程序验证csv的内容,以确保行和单元格都有效。当我发现错误时 - 我希望消息具体。有没有办法从Validator :: extend()发送信息到Validator :: replacer()?
不幸的是我的公司infra不好,所以我没有会话或redis或任何东西。纯php / laravel解决方案。
答案 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
}
}