我正在将保存编辑保存到实体 - 唯一的麻烦是下面的密码验证功能是UsersTable的一部分,即使我没有更改密码字段,它也希望被调用:
->add('password',[
'custom'=>[
'rule'=> function($value, $context){
$pattern = '$\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$';
return (bool)preg_match($pattern, $context['providers']['entity']->beforeHash);
},
'message'=>'Your password must have 1 uppercase letter, 1 lowercase letter, 1 number, and 1 special character ie. !@#$%'
],
])
我尝试在其中添加一个语句 - 文档中描述的'on'参数:
'on' => function ($context) {
return empty($context['providers']['password]);
},
这允许我进行更改,因为它只在字段为空时(即,当我们第一次创建用户时)运行验证。
不幸的是,它还破坏了我的其他功能 - 更改和重置密码。在这些情况下,会在字段中设置密码,因此当我尝试更改或重置密码时,验证将不适用。
所以我和Github CakePHP3的人谈过,他们建议我查看脏字段,看看是否有人试图更改密码。
这是一个好主意,但我如何访问该领域?一旦我深入到阵列中,我就不能再深入了解:
$context['providers']['entity'] // this returns my object, but doesn't go deep enough
$context['providers']['entity']['dirty'] // this doesn't work - returns null, even though there is data inside on the debug
那么如何从我所在的上下文中访问脏数组呢?如果我可以看到密码字段正在更新,我可以例外并解决问题。
答案 0 :(得分:4)
dirty()检查字段是否已被修改。
->validatePresence('password', 'create')
->add('password',[
'custom'=>[
'rule'=> function($value, $context){
$pattern = '$\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W])\S*$';
return (bool)preg_match($pattern, $context['providers']['entity']->beforeHash);
},
'on' => function ($context) {
return $context['providers']['entity']->dirty('password');
},
'message'=>'Your password must have 1 uppercase letter, 1 lowercase letter, 1 number, and 1 special character ie. !@#$%'
],
])