Oop*_*'oh 7 validation cakephp-3.0 cakephp-3.1 cakephp-3.x
关于验证的多个问题可能属于一起,因为它们都是在CakePHP 3中解决新的验证概念.
我已阅读的章节(1,2,3的食谱多次),但老实说,我不明白怎么做的正确方法.我也知道GitHub目前有一个关于CakePHP3验证的问题/讨论可能涉及同一主题.
例如使用patchEntity触发验证错误.所以我认为在执行保存操作之前始终检查/显示错误会更好:
// src/Controller/UsersController.php
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data, ['validate' => 'default'] );
if ( $user->errors() ) {
$this->Flash->error('There was a Entity validation error.');
} else {
// Optional: Manipulate Entity here, e.g. add some automatic values
// Be aware: Entity content will not be validated again by default
if ( $this->Users->save($user) ) {
$this->Flash->succeed('Saved successfully.');
return $this->redirect(['controller' => 'Users', 'action' => 'index']);
} else {
$this->Flash->error('Not saved - ApplicationRule validation error.');
}
}
}
$this->set('user', $user);
}
Run Code Online (Sandbox Code Playgroud)
为什么$user->errors()在保存数据之前不会使用cookbook教程?据我所知,save如果已经有验证错误,则不需要调用它?!另一种方法是结合错误检查和保存操作:
if ( !$user->errors() && $this->Users->save($user) ) {
$this->Flash->succeed('Saved successfully.');
return $this->redirect(['controller' => 'Users', 'action' => 'index']);
} else {
$this->Flash->error('There was a validation OR ApplicationRule error.');
}
Run Code Online (Sandbox Code Playgroud)
你在用这个吗?我应该用吗?如果没有,为什么不呢?
为什么CakePHP显示验证错误,即使我不在$user->errors()控制器中使用,就像所有的食谱示例一样?我以为save不会检查实体验证?!
示例:isUnique
根据食谱 "确保电子邮件唯一性"是应用程序规则的用例.
// src/Model/Table/UsersTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\ORM\RulesChecker;
use Cake\ORM\Rule\IsUnique;
// Application Rules
public function buildRules(RulesChecker $rules) {
$rules->add($rules->isUnique(['email'], 'This email is already in use'));
return $rules;
}
Run Code Online (Sandbox Code Playgroud)
该错误只能save在控制器中使用-call 触发.但也可以检查验证中的唯一性.为什么不这样做更好?
// src/Model/Table/UserTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
public function validationDefault(Validator $validator) {
$validator
->add('email', [
'unique' => [
'rule' => 'validateUnique',
'provider' => 'table',
'message' => 'This email is already in use'
],
])
return $validator;
}
Run Code Online (Sandbox Code Playgroud)
如果我可以在验证中添加ApplicationRule,为什么我应该/应该使用ApplicationRules?
如何在ApplicationRule中定义何时应该仅在特定操作(不是所有创建/更新调用)中应用规则?
当在patchEntity-call 之后操作实体时,我也没有看到或理解两个分离的验证状态的好处.
如果我自动向实体添加一些值,我想确保在将它们保存到数据库之前值仍然有效(如在CakePHP2中).所以我认为总是 使用验证作为应用程序规则更好/最好?
你如何处理这个问题?是否有其他示例可用于显示/演示Validation与ApplicationRules的好处和一些用例?
我认为你混淆的主要原因是你不知道save()如果它已经包含错误就不会保存实体.例如:
$entity = $users->newEntity(['email' => 'not an email']);
$users->save($entity); // Returns false
Run Code Online (Sandbox Code Playgroud)
它将返回false的原因是因为在继续实际保存过程之前save()读取$entity->errors()结果.因此,在调用之前手动检查错误是不必要的save(),就像手册中的示例所示.
电子邮件唯一性示例有点棘手,因为您要检查面向用户的表单(针对哪些验证)和应用程序规则.
重要的是要记住Validation,就像在validation*()方法中一样,用于向人们提供关于他们提供的数据的反馈.您希望在保存过程开始之前在表单中显示所有错误(包括嵌套属性的错误).
由于Validation很少发生在数据库事务中,因此没有实际保证在验证和保存电子邮件之间仍然是唯一的.这是应用程序规则试图解决的问题之一:应用程序规则在与保存过程的其余部分相同的事务中运行,因此任何检查都会有一致性保证.
应用程序规则解决的另一个问题是它们可以处理已在实体上设置的数据,因此您可以完全访问对象的当前状态.在修补实体或创建新实体时,这是不可能的,因为任何传递的数据都可能不一致.
| 归档时间: |
|
| 查看次数: |
2268 次 |
| 最近记录: |