关于验证的多个问题可能属于同一类,因为它们都涉及到CakePHP 3中的新验证概念。
我已经多次阅读了Cookbook中的章节(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.');
}
你使用这个吗?我应该使用它吗?如果不使用,为什么?
为什么在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;
}
只有在控制器中进行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仅在特定操作(而非所有create/update调用)中应用规则?
当实体在patchEntity调用之后被操作时,我也看不到或理解两个分离的验证状态的好处。
如果我自动向实体添加一些值,我希望在将它们保存到数据库之前确保这些值仍然是有效的(就像在CakePHP2中)。所以我猜最好/必要的是始终 将验证作为应用程序规则使用 ?!
你通常如何处理这个问题?是否有其他示例可用来展示/演示验证与ApplicationRules的好处和一些用例?
return $context['data']['price'] < 100 && $context['data']['shipping_mode'] === 'free';
。 - Oops D'oh['validate' => 'customValidationForThisAction']
,但不能定义哪些应用程序规则(除了一般的addCreate / addUpdate)? - Oops D'oh$table->rulesChecker()
并在调用save()
之前直接操作对象来在运行时更改规则。 - José Lorenzo Rodríguez