多次扩展Laravel验证器

Pro*_*tas 2 php validation package laravel

confirmation规则类似,我正在创建一个基于另一个属性值的验证规则.根据我的发现,实现这一目标的唯一方法是扩展Validator类并获取值$this->data.

文档说扩展Validator然后用于Validator::resolver注册新的扩展类.这样可以正常工作,但仅在单个解析器的情况下,因为似乎每个后续定义的解析器都会覆盖前一个解析器.

怎样才能解决这个问题?我们如何定义仍然可以访问其他属性的自定义验证器,而无需将所有方法放在同一个类中......?

谢谢

//

注意:我问这个是因为我想发布一些验证器软件包,但是按照上面的推理,如果有人安装了多个软件包,它们就变得毫无用处......

Sam*_*amV 8

是的,它被覆盖的原因是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)

总而言之,传递一个额外的参数,该参数将是正在使用的验证器的实例.我怀疑这也适用于回调.

希望这有帮助,它对我有用!