【问题标题】:How to access other input attributes in Validator::extend?如何访问 Validator::extend 中的其他输入属性?
【发布时间】:2014-04-24 19:49:17
【问题描述】:

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

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

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

谢谢。

编辑

我还尝试将其包装在 Jason Lewis 的 this method 之后的一个包中,但我不断收到一个 BadMethodCallException 指出无法找到验证方法...该包符合 psr-0 并且我我很确定这不是命名空间问题。

【问题讨论】:

  • 您可以使用Input::get() 来获取闭包内的其他字段吗?
  • 我实际上并没有考虑过直接通过它的外观获取输入。令人惊讶的是,这确实有效...如果将其包装在一个包中,我不确定是否要依靠外观是要走的路?
  • IMO 使用Input::get() 是非常hacky。当您不想针对不是来自请求的数据进行验证时会发生什么?不完全是可重用的自定义验证规则..
  • 绝对是“hacky”,我喜欢下面@SamV 的回答

标签: php validation laravel package


【解决方案1】:

经过一些测试,如果您使用类而不是回调,则可以访问该数组。因为它扩展了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');

【讨论】:

  • 感谢您的回答。我早些时候探索了建议的解决方案,但我偶然发现了 BadMethodCallException 指出找不到 validateTestRule 方法...
  • 您是否尝试过阅读文档并按照其中的示例进行操作?
  • 我现在无法对其进行测试,但我确实注意到您的答案与文档中的答案略有不同。您将验证方法完全限定为Validator::extend('bar', 'FooValidator@validateBar'),而文档只是指向“验证”前缀Validator::extend('bar', 'FooValidator@validate')
  • 更新:刚试过,但我不能让它工作。我收到了 BindingResolutionException 声明 Target [Symfony\Component\Translation\TranslatorInterface] is not instantiable
  • 我从来没有在一个包中尝试过,也许看看其他一些在其中有规则的包?
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 2016-01-29
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 2018-07-07
相关资源
最近更新 更多