Cakephp 验证更新实体上的数据

Posted

技术标签:

【中文标题】Cakephp 验证更新实体上的数据【英文标题】:Cakephp validate data on update entity 【发布时间】:2020-10-15 19:42:23 【问题描述】:

更新实体数据时,我无法使验证正常工作。更改初始数据后验证不起作用。下面的代码提供了一个例子:

    // in controller
    $user = $this->Users->newEntity([
        'mail' => 'wrong',
        'password' => 'password',
        'auth_level' => 0,
    ]);
    debug($user->getErrors()); // Will show error: wrong email format
    $user->mail = "correct@correct.correct";
    debug($user->getErrors()); // Will show no errors
    $user->mail = "wrong";
    debug($user->getErrors()); //Will show no errors

    if (TableRegistry::get('users')->save($user)) 
       // This actually executes
    

我在模型中的验证规则如下:

public function validationDefault(Validator $validator): Validator

    $validator
        ->email('mail')
        ->add('mail', 'unique',
            [
                'on' => ['create', 'update'],
                'rule' => 'validateUnique',
                'provider' => 'table',
                'message' => "Email already in use"
            ]
        );
     return $validator

我尝试使用“on”=>“update”创建规则,但没有帮助。

我想要实现的是获取一个实体,更改电子邮件地址并将其保存回数据库。保存后,电子邮件字段既不验证格式也不验证唯一性。

【问题讨论】:

【参考方案1】:

解决方案是始终使用

更新实体数据
$model->patchEntity($entity, $newdata)

【讨论】:

【参考方案2】:

为了完整性。

应用规则和验证规则是有区别的。

验证规则验证通常来自用户输入的数据(newEntity()、patchEntity())。实体被重新生成。烘焙的在 Tables 中的“validationDefault”函数中。

应用程序规则为在应用程序代码中修改的数据建立一些规则,这些规则预计是“安全的”(setter)。实体不会重新生成。烘焙的在 Tables 中的“buildRules”函数中。

“save()”函数不会通过验证规则,而是通过应用程序规则。

当保存需要通过验证规则的数据时,因为它是在应用程序中分配/设置的,但它是来自用户输入的数据,请确保使用 patchEntity()。

更多信息:https://github.com/cakephp/cakephp/issues/6654

【讨论】:

以上是关于Cakephp 验证更新实体上的数据的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3.0 中虚拟字段/实体属性上的分页排序链接

CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段

CakePHP身份验证插件身份关联

CakePHP 3 新实体保存失败且没有错误

使用自定义身份验证适配器时检查 CakePHP 上的登录用户信息

cakephp3 如何检查实体是不是是新插入的 afterSave 回调?