如果字段脏了,我怎么能关闭CakePHP 3验证?

时间:2014-10-24 14:16:29

标签: php validation cakephp cakephp-3.0

我正在将保存编辑保存到实体 - 唯一的麻烦是下面的密码验证功能是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

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

1 个答案:

答案 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. !@#$%'
            ],
        ])