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