【发布时间】:2015-06-27 10:55:18
【问题描述】:
关于验证的多个问题可能属于一起,因为它们都在处理 CakePHP 3 中的新验证概念。
我已多次阅读食谱中的章节(1、2、3),但老实说,我不明白如何以正确的方式进行操作。我也知道目前有一个 issue/discussion at GitHub 关于 CakePHP3 中的验证可能涉及相同的主题。
触发验证错误,例如与补丁实体。所以我认为在执行保存操作之前总是检查/显示错误会更好:
// 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
根据cookbook“确保电子邮件唯一性”是应用程序规则的一个用例。
// 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-才会触发错误。但也可以在验证中检查唯一性。为什么不这样做更好?
// 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 中)。所以我想总是 Using Validation as Application Rules?!
更好/必要您一般是如何处理这个问题的?是否有其他示例可用于展示/展示验证与应用程序规则的好处和一些用例?
【问题讨论】:
标签: validation cakephp-3.0 cakephp-3.1 cakephp-3.x