【问题标题】:CakePHP 3.x Custom Validation Field RequiredCakePHP 3.x 自定义验证字段必填
【发布时间】:2016-09-07 16:50:26
【问题描述】:

当我动态构建表单元素时,我希望能够通过自定义验证规则检查表单字段是否需要。问题是,当我添加自定义验证规则时,它会强制该字段不为空。如果我允许该字段为空,它不会检查我的自定义验证器,除非在该字段中输入了某些内容。

如何在回调中检查是否根据需要允许字段?

在我的提交表中

 public function validationDefault(Validator $validator)
 {
        $validator
        ->add("custom_value_q", [
            "custom" => [
                "rule" => [$this, "customFieldIsRequired"],
                "message" => "Message Here"
                    ]
                ]
            );
     return $validator;
}       

public function customFieldIsRequired($value, $context) 
{
 //logic here 
 return true;
}

【问题讨论】:

    标签: cakephp cakephp-3.2


    【解决方案1】:

    我知道这有点老了,但我也面临同样的问题,正如我在 github 上看到的,关于它的讨论仍然开放(https://github.com/cakephp/cakephp/issues/8925https://github.com/cakephp/cakephp/issues/12484)。

    在这种情况下,当您的某个字段在某些情况下可能为空时(可能是其他字段已填写),您可以这样做:

        $validator->allowEmptyString('field_a', function ($context) {
            // check whether the field can or cannot be empty
            return $canBeEmpty;
        });
    

    因为在构建空表单(对于新实体)时这可能会被错误评估,因为所有字段可能都是空的,您可能必须将属性 required => false 添加到表单输入中,如果不是,该字段将被标记为必填,要求填写为必填项。

    虽然必须指示表单助手是否需要该字段远非理想,但这并不是什么大问题,并且还可以验证实体和无模式表单。

    仅用于验证实体,根据此(https://github.com/cakephp/cakephp/issues/12484#issuecomment-414465002),您可以使用应用程序规则,这些规则仅在实体被持久化时进行评估,因此可以允许字段在验证中为空,然后应用程序规则将被无论如何都申请了。

    【讨论】:

      【解决方案2】:

      当传入空的 $value 时,在您的自定义中返回 true 应该可以解决问题。

      如果您希望该字段允许空字符串(=空),请在顶部使用allowBlank('custom_value_q'),逻辑上您不需要调用自定义验证器函数,这就是它在空情况下被绕过的原因.

      //更新 但是,您可以选择为 allowEmpty() 提供回调,这样应该可以仅在您确实需要时调用自定义验证规则(如果该字段因为非空白而需要验证)。

      $validator->allowEmpty('fieldname', function ($context) { return !isset($context['data']['description']) || $context['data']['description'] !== ''; });

      【讨论】:

      • 马克,我已经设置好了。我在我的自定义函数中返回 true(用于测试),并且当没有输入任何内容时,该字段仍然无法验证(甚至不调用自定义验证器函数,除非用户输入一些数据)。我希望能够在我的自定义函数中确定该字段是否允许为空。我也尝试了allowBlank,但得到一个“未定义的方法”。还有其他想法吗?
      • 还有其他想法吗?我似乎无法弄清楚这一点。
      • 我也非常渴望得到这个问题的答案@wilsmex。在花了几个小时与验证器争吵之后,我开始做这件事,这只是 Cake 中的一个错误,令人沮丧的是,对这些问题的关注如此之少。
      • 你说得对,我刚刚确认这似乎是系统中的一个错误。你能在github.com/cakephp/cakephp/issues 开一张票吗?然后我们可以尽快修复它。
      • 好吧,也许不是错误本身,但肯定会在您的用例中出现不良行为。问题是,一旦您有了自定义验证规则,该字段就必须是非空白的。我更新了答案。
      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 2012-11-27
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多