如何手动检查 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()
将消息作为第二个参数,并将回调作为第三个参数。
另见
问题已更新:我发现了更多信息,因此更改了我的问题。
我想用他的许可证号保存我的用户,但前提是他选择他有许可证。 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()
将消息作为第二个参数,并将回调作为第三个参数。
另见