Pro*_*tas 2 php validation package laravel
与confirmation
规则类似,我正在创建一个基于另一个属性值的验证规则.根据我的发现,实现这一目标的唯一方法是扩展Validator类并获取值$this->data
.
文档说扩展Validator然后用于Validator::resolver
注册新的扩展类.这样可以正常工作,但仅在单个解析器的情况下,因为似乎每个后续定义的解析器都会覆盖前一个解析器.
怎样才能解决这个问题?我们如何定义仍然可以访问其他属性的自定义验证器,而无需将所有方法放在同一个类中......?
谢谢
//
注意:我问这个是因为我想发布一些验证器软件包,但是按照上面的推理,如果有人安装了多个软件包,它们就变得毫无用处......
是的,它被覆盖的原因是Validator\Factory
该类只存储一个resolver
.该函数的代码在这里:
public function resolver(Closure $resolver) {
$this->resolver = $resolver;
}
Run Code Online (Sandbox Code Playgroud)
我假设该resolver
方法的重点是使用您自己的扩展基本验证类.这是有道理的,因为您可以实例化UserRegistrationValidator
添加自己的验证规则,这些规则具有与现有验证规则一样的灵活性.
这个问题的一个问题是它可以轻松覆盖,这告诉我你应该只resolver
在调用之前调用方法make
.虽然付出了更多努力,但它会阻止来自不同软件包的规则,这些规则可能会自动覆盖其他规则甚至是基本规则
但是这对于仅提供额外有用规则的包不适用.添加规则的更简单版本是:
Validator::extend('foo', 'FooValidator@validate');
Run Code Online (Sandbox Code Playgroud)
这不允许访问输入数据,这对复杂的规则很重要.该文档例子告诉我们,这也:
class CustomValidator extends Illuminate\Validation\Validator
{
public function validateFoo($attribute, $value, $parameters) {
return $value == 'foo';
}
}
Run Code Online (Sandbox Code Playgroud)
可是等等!文档没有告诉你的是你可以添加另一个参数来获取实例Validator
.我在写这个答案并深入了解课程时才发现自己!
class TestRulesValidator
{
public function validateTestRule($attribute, $value, $params, $validator) {
var_dump($validator->getData());
}
}
Validator::extend('test_rule', 'TestRulesValidator@validateTestRule');
Run Code Online (Sandbox Code Playgroud)
总而言之,传递一个额外的参数,该参数将是正在使用的验证器的实例.我怀疑这也适用于回调.
希望这有帮助,它对我有用!