CakePHP 3 - 由于某种原因,Cake尝试验证notEmpty

时间:2016-07-27 13:00:36

标签: php cakephp cakephp-3.0

我的桌子正在抛出一个默认的" 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?

2 个答案:

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

因此,在这种情况下,如果用户选择收货地址与账单地址不同,则各个收货字段必须为非空。