问题更新:我发现了更多信息,因此改变了我的问题。
我想用他的许可证号保存我的用户,但前提是他选择了拥有许可证的用户。我为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运行我的自定义函数以查看该字段是否可以为空,而不仅仅是假设该字段永远不能为空或必须始终为空?
默认情况下,不允许将字段为空,所以这是预期的行为,您必须明确允许使用空值。
为了实现您要执行的操作,您应该自定义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()
将消息作为第二个参数,并将回调作为第三个参数。 。
另请参见