Несколько вопросов о валидации, которые могут быть связаны друг с другом, потому что все они касаются новой концепции валидации в CakePHP 3.
Я прочитал главы (1, 2 , 3) в cookbook несколько раз, но, честно говоря, я не понимаю, как это сделать правильно. Я также знаю, что в настоящее время существует проблема/ обсуждение на 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, КОГДА правило должно применяться только в определенном действии (не во всех вызовах создания/обновления)?
Я также не вижу и не понимаю преимущества двух разделенных состояний проверки, когда объектом манипулируют после вызова patchEntity
.
В случае, если я автоматически добавляю некоторые значения в объект, я хочу убедиться, что все значения все еще действительны, прежде чем сохранять их в базе данных (как в CakePHP2). Поэтому я бы предположил, что лучше/необходимо ВСЕГДА Использование проверки в качестве правил приложения?!
Как вы с этим вообще справляетесь? Имеются ли другие примеры для демонстрации/демонстрации преимуществ и некоторых вариантов использования правил проверки и приложений?