我正在保存对实体的编辑 - 唯一的问题是下面的这个密码验证函数是用户表的一部分,即使我没有更改密码字段,它也希望被调用:
->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
那么如何从我所在的上下文中访问脏数组呢?如果我可以看到密码字段正在更新,我可以例外并解决问题。