关于验证的多个问题可能属于一起,因为它们都在处理 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);
}
为什么食谱教程$user->errors()
在保存数据之前不使用?据我了解,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.');
}
你在用这个吗?我应该使用它吗?或者如果不是,为什么不呢?
为什么即使我没有$user->errors()
在控制器中使用 CakePHP 也会显示验证错误,就像在所有食谱示例中一样?我以为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;
}
该错误只能通过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;
}
如果我可以在验证中添加 ApplicationRule,为什么我会/应该使用 ApplicationRules?
我如何在 ApplicationRule 中定义规则何时应仅应用于特定操作(并非所有创建/更新调用)?
patchEntity
当在-call之后操作实体时,我也没有看到或理解两个单独的验证状态的好处。
如果我自动向实体添加一些值,我想确保这些值在将它们保存到数据库之前仍然有效(如在 CakePHP2 中)。所以我想总是 使用验证作为应用程序规则更好/必要?!
你一般如何处理这个问题?是否有其他示例可用于显示/展示验证与应用程序规则的好处和一些用例?