Cakephp验证更新实体上的数据



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

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

我试着用";关于"=>quot;"更新";,但这无济于事。

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

为了完整性。

应用程序规则和验证规则之间存在差异。

验证规则验证通常来自用户输入(newEntity((、patchEntity((((的数据。实体已重新生成。烘焙的是";validationDefault";函数。

应用程序规则为在应用程序代码中修改的数据建立一些规则,这些规则被认为是"安全的"(setter(。实体未重新生成。烘焙的是";buildRules";函数。

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

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

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

解决方案是始终使用更新实体数据

$model->patchEntity($entity, $newdata)

最新更新