需要CakePHP 3.x自定义验证字段

需要CakePHP 3.x自定义验证字段,cakephp,cakephp-3.2,Cakephp,Cakephp 3.2,在动态构建表单元素时,我希望能够通过自定义验证规则检查并查看表单字段是否是必需的。问题是,当我添加自定义验证规则时,它会强制字段不为空。如果我允许字段为空,它不会检查我的自定义验证器,除非在字段中输入了内容 如何在回调中签入是否允许按要求使用字段 顺服 public function validationDefault(Validator $validator) { $validator ->add("custom_value_q", [

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

如何在回调中签入是否允许按要求使用字段

顺服

 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;
}

当传入空$value时,在自定义值中返回true应该可以做到这一点

如果希望字段允许空字符串(=empty),请在顶部使用allowBlank('custom_value_q'),从逻辑上讲,您不需要调用自定义验证器函数,这就是为什么在空情况下会绕过它

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


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

我知道这有点陈旧,但我面临着同样的问题,正如我在github中看到的,关于它的讨论仍然是开放的(和)

在这种情况下,当您有一个字段在某些情况下可能为空时(如果其他字段已填充,则可能为空),您可以执行以下操作:

$validator->allowEmptyString('field_a',function($context){
//检查该字段是否可以为空
返回$canBeEmpty;
});
由于生成空表单(针对新实体)时可能会错误地评估此属性,因为所有字段都可能为空,因此您可能必须将属性
required=>false
添加到表单输入中,否则该字段将标记为required,并要求强制填写

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


仅用于验证实体,根据此(),您可以使用应用程序规则,仅当实体被持久化时才会对其进行评估,因此在验证中允许一个字段为空,然后应用程序规则。

Mark,这是我已经设置的。我在自定义函数中返回true(用于测试),当没有输入任何内容时,字段仍然无法验证(除非用户输入一些数据,否则甚至不会调用自定义验证器函数)。我希望能够在自定义函数中确定字段是否允许为空。我也尝试了allowBlank,但得到了一个“未定义的方法”。还有其他想法吗?还有其他想法吗?我似乎无法理解这个问题。我也非常渴望这个问题的答案@wilsmex。在花了几个小时与验证器抗争之后,我开始做这件事,这只是蛋糕上的一个bug,令人沮丧的是,对这些问题的关注如此之少。你是对的,我刚刚确认这似乎是系统中的一个bug。你能帮我开一张票吗?然后我们可以尽快修复它。好吧,也许不是bug本身,但在您的用例中肯定会出现不希望出现的行为。问题是,一旦有了自定义验证规则,该字段就必须是非空的。我更新了答案。