CakePHP更新记录自定义验证规则问题:新增记录时规则仍生效
解决密码验证规则在创建/更新场景下的冲突问题
嘿,我一眼就瞅出问题所在了——你给notEmpty和allowEmpty都加了场景限定,但核心的validFormat自定义验证规则没指定生效场景!这就导致不管是创建用户还是更新用户,这个密码格式验证都会触发,完全不符合你“仅更新时检查原密码格式”的需求。
修复后的验证代码
$validator->scalar('password') ->maxLength('password', 25) ->notEmpty('password', 'Password is required', 'create') ->allowEmpty('password', 'update') ->add('password', 'validFormat', [ 'rule' => ['custom', '/^(?=.*[!@$])(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{6,16}$/i'], 'message' => __('Minimum 6 characters, must include uppercase, lowercase, number and special character (!@$)'), 'on' => 'update', // 关键:指定仅在update场景生效 'when' => function ($context) { // 仅当用户输入了新密码时,才触发格式验证 return !empty($context->getData()['password']); } ]);
关键改动说明
'on' => 'update':直接把这个格式验证规则绑定到update场景,确保创建用户时完全不会触发它;when回调函数:处理用户更新时不修改密码的场景——如果密码字段为空(用户没填新密码),就跳过格式验证,完美匹配你设置的allowEmpty('password', 'update')逻辑;- 补全了错误提示信息,让用户更清楚密码格式的具体要求(你原来的提示没写完,建议完善)。
额外注意事项
别忘了在更新用户的控制器方法里,明确设置验证场景,否则on参数会失效:
// 示例:在控制器的update方法中 $validator = $this->Validation->createValidator(); $validator->setScenario('update'); // 必须指定场景 $errors = $validator->validate($data);
这样调整后,创建用户时只会执行必填项和长度/类型验证,更新用户时只有当用户输入了新密码,才会触发格式验证,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Karthikeyan Raju
相关产品推荐
相关产品推荐

