如何访问Validator :: extend中的其他输入属性?

时间:2014-03-18 21:08:02

标签: php validation laravel package

正如问题标题所述: 使用Validator :: extend时如何访问其他输入属性?

在检查Laravel的内置Validator类后,我可以看到它使用$this->data来访问其他属性;但是你不能在Validator :: extend所需的闭包中直接使用$this

似乎手动扩展Validator类(通过自定义类)是唯一的选择......我是否正确?如果是这样,在我看来这似乎是将验证器转换为包的严重限制,因为每个包都会扩展基本的Validator类,PHP最终会保留最后定义的扩展(从而使其他验证器包无法使用......)。或者我错过了什么?

感谢。

修改

我还尝试将其包装在Jason Lewis的this method之后的包中,但我不断得到BadMethodCallException声明无法找到验证方法...包是psr-0合规,我很确定它不是命名空间问题。

1 个答案:

答案 0 :(得分:18)

经过一些测试后,如果您使用的是类而不是回调,则可以访问该数组。因为它扩展了Validator类。

class TestRulesValidator extends \Illuminate\Validation\Validator
{

    public function validateTestRule($attribute, $value, $parameters)
    {
        var_dump($this->data);

        exit();
    }

}

validation documentation开始,使用:

Validator::resolver(function($translator, $data, $rules, $messages) {
    return new TestRulesValidator($translator, $data, $rules, $messages);
});

您的规则名称为test_rule。删除validate关键字并转换为下划线大小写。

刚刚在全新安装上测试过它,它可以正常工作。

修改 - 您还可以使用普通extend方法并传递额外参数。

class TestRulesValidator
{

    public function validateTestRule($attribute, $value, $params, $validator) {
        var_dump($validator->getData());
    }

}

Validator::extend('test_rule', 'TestRulesValidator@validateTestRule');