2014-03-18 36 views
14

问题标题如下: 如何在使用Validator :: extend时访问其他输入属性?如何访问Validator :: extend中的其他输入属性?

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

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

谢谢。

编辑

我也试图把它包起来贾森·刘易斯以下this method一个包,但我不断收到一个BadMethodCallException指出的验证方法找不到......包是PSR-0我很确定这不是一个命名空间问题。

+2

你能够使用'Input :: get()'来获取你的闭包内的其他字段吗? – duellsy

+0

我没有真正考虑过直接通过它的外观获取输入。而令人惊讶的是,这**做**工作......如果将它包装在一个包中,我不太确定依赖于外观是否可行? – Propaganistas

+0

使用'Input :: get()'的IMO非常黑客。如果您不想验证不是来自请求的数据,会发生什么情况?不完全是一个可重用的自定义验证规则.. – SamV

回答

15

经过一些测试后,如果使用类而不是回调,则可以访问数组。因为它延伸了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', '[email protected]'); 
+0

感谢您的回答。我早些时候探索了这个建议的解决方案,但是我偶然发现了一个'BadMethodCallException',说明找不到validateTestRule方法... – Propaganistas

+0

您是否尝试过阅读文档并遵循那里的示例? – SamV

+0

我目前无法对其进行测试,但我确实注意到您的答案和文档中的答案有一点区别。您完全限定验证方法为Validator :: extend('bar','FooValidator @ validateBar')'而文档只是指向'validate'前缀'Validator :: extend('bar','FooValidator @ validate' )'。 – Propaganistas

相关问题