我的桌子正在抛出一个默认的" notEmpty"验证错误,即使我没有写过任何类型的验证。
我的Table类中的基本验证:
public function validationDefault(Validator $validator)
{
return $validator->requirePresence('my_field', 'create', 'Custom error message');
}
正在设置数据:
['my_field' => null]
据我从文档中可以看出,这不应该无法通过验证。
使用array_key_exists()检查密钥存在,以便将空值计为存在。
然而,实际发生的情况是验证失败并显示一条消息:
'my_field' => 'This field cannot be left empty'
这是Cake的notEmpty()
验证功能的默认消息,那么它来自哪里?我希望它允许null值。我的数据库字段也允许NULL。
修改
我已设法通过将allowEmpty()
添加到该字段的验证来解决此问题。因此,这似乎表明,Cake假定如果您的字段是必填字段,您还希望默认情况下验证notEmpty()
,即使您没有告诉它。
这与我上面显示的文档行直接相矛盾:
使用array_key_exists()检查密钥存在,以便将空值计为存在。
文档是否需要更新,还是一个bug?
答案 0 :(得分:0)
虽然Cake 3文档中没有提到,但默认情况下不允许必填字段为空,因此您必须明确声明该字段是必需的和允许为空。< / p>
public function validationDefault(Validator $validator)
{
return $validator
->requirePresence('my_field', 'create', 'Custom error message')
->allowEmpty('my_field', 'create');
}
答案 1 :(得分:0)
这让我难过了一段时间。默认行为一点也不直观。这是一些将条件验证应用于编码为[ targetField, whenConditionalField, isConditionalValue ]
public function validationRegister()
{
$validator = new Validator();
$conditionals = [ ['shipAddress1','shipEqualsBill','N'], ['shipTown','shipEqualsBill','N'], ['shipPostcode','shipEqualsBill','N'] ];
foreach($conditionals as $c) {
if (!is_array($c[2])) $c[2] = [$c[2]];
// As @BadHorsie says, this is the crucial line
$validator->allowEmpty($c[0]);
$validator->add($c[0], 'notEmpty', [
'rule' => 'notEmpty',
'on' => function ($context) use ($c) {
return (!empty($context['data'][$c[1]]) && in_array($context['data'][$c[1]], $c[2]));
}
]);
}
return $validator;
}
因此,在这种情况下,如果用户选择收货地址与账单地址不同,则各个收货字段必须为非空。