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

问题描述 投票:0回答:1

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

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

为了实现这一点,我编写了以下验证功能:

$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 Model类中的另一项检查,如果该值为空,它将拒绝该值。我试图通过添加->allowEmpty('license_nr')来解决此问题,但是该规则使模型即使不运行我的自定义函数也可以接受空字符串。即使将它们排序并在我的自定义规则上使用'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运行我的自定义函数以查看该字段是否可以为空,而不仅仅是假设该字段永远不能为空或必须始终为空?

validation cakephp cakephp-3.x
1个回答
0
投票

默认情况下,不允许将字段为空,所以这是预期的行为,您必须明确允许使用空值。

为了实现您要执行的操作,您应该自定义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()将消息作为第二个参数,并将回调作为第三个参数。 。

另请参见

© www.soinside.com 2019 - 2024. All rights reserved.