1

我正在保存对实体的编辑 - 唯一的问题是下面的这个密码验证函数是用户表的一部分,即使我没有更改密码字段,它也希望被调用:

->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

那么如何从我所在的上下文中访问脏数组呢?如果我可以看到密码字段正在更新,我可以例外并解决问题。

4

1 回答 1

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. !@#$%'
            ],
        ])
于 2014-10-24T16:03:22.907 回答