如何手动检查 CakePHP 模型字段要求?

How to have a CakePHP model field requirement checked manually?

问题已更新:我发现了更多信息,因此更改了我的问题。

我想用他的许可证号保存我的用户,但前提是他选择他有许可证。 pilot_type 字段(ROC、ROC-light 和 recreative)我有三个可能的值,只有最后一个选项应该允许提交空字符串。

为了实现这一点,我写了如下验证函数:

$validator
    ->add('license_nr', 'present_if_license', [
        'rule' => function ($value, $context) {
            return $context['data']['pilot_type'] == 'recreative' || !empty($value);
        },
        'message' => "If you don't fly recreatively, a license number needs to be supplied"
]);

问题在于,在字段上设置任何验证规则都会触发 CakePHP 模型 class 中的额外检查,如果该值为空,则会拒绝该值。我试图通过添加 ->allowEmpty('license_nr') 来解决此问题,但该规则使模型接受空字符串,甚至没有 运行ning 我的自定义函数。即使将它们按顺序排列并在我的自定义规则中使用 'last' => true 也无法解决此问题:

$validator
    ->add('license_nr', 'present_if_license', [
        'rule' => function ($value, $context) {
            return false;
            // return $context['data']['pilot_type'] == 'recreative' || !empty($value);
        },
        'last' => true,
        'message' => "If you don't fly recreatively, a license number needs to be supplied"
    ])
    ->allowEmpty('license_nr');

如何使 CakePHP 运行 成为我的自定义函数,以便查看该字段是否可以为空,而不是仅仅假设它永远不会为空或必须始终为空?

默认情况下,字段不允许为空,因此这是预期的行为,您必须明确允许空值。

为了实现你想要做的事情,而不是使用额外的规则,你应该自定义 allowEmpty() 规则,使用第二个参数来提供回调(注意不像规则回调它将收到一个提供上下文的参数)。

所以你会做这样的事情,你可能需要稍微修改一下,例如取决于你是否需要它以不同的方式工作来创建 ($context['newRecord'] = true) 和更新 ($context['newRecord'] = false) 记录:

->allowEmpty(
    'license_nr',
    function ($context) {
        return $context['data']['pilot_type'] === 'recreative';
    },
    "If you don't fly recreatively, a license number needs to be supplied"
)

从 CakePHP 3.7 开始,您可以使用 allowEmptyString(),它的工作方式相同,您只需要交换第二个和第三个参数,因为 allowEmptyString() 将消息作为第二个参数,并将回调作为第三个参数。

另见