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 - 实体更新时出错 - 即使有值,也会声明缺少字段