Validação confusa vs. regras de aplicação no CakePHP3
Várias perguntas sobre validação que podem pertencer uma à outra, porque são todos os tipos de abordar o novo conceito de validação no CakePHP 3.
Eu li os capítulos (1, 2, 3) no livro de receitas várias vezes, mas sinceramente não entendo como fazê-lo da maneira certa. Eu também sei que existe atualmente umquestão / discussão no GitHub sobre a validação no CakePHP3, que pode abordar o mesmo tópico.
Erros de validação são acionados p. com patchEntity. Então, eu acho que é melhor sempre verificar / exibir erros antes de executar a ação de salvar:
// 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);
}
Por que os tutoriais do livro de receitas não fazem uso de$user->errors()
antes de salvar os dados? Tanto quanto eu entendosave
não precisa ser chamado se já houver um erro de validação ?! Outra maneira seria combinar a verificação de erros e salvar a ação:
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.');
}
Você está usando isso? Devo usá-lo? Ou se não, por que não?
Por que o CakePHP mostra os erros de validação, mesmo que eu NÃO use$user->errors()
no controlador, como em todos os exemplos de livros de receitas? eu penseisave
NÃO verificará a validação da entidade ?!
Exemplo: isUnique
De acordo comlivro de receitas "Garantir a exclusividade do email" é um caso de uso para regras de aplicativo.
// 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;
}
O erro seria acionado apenas com umsave
-chamar no controlador. Mas também é possível verificar a exclusividade na validação. Por que é melhor NÃO fazer dessa maneira?
// 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;
}
Se eu posso adicionar o ApplicationRule na Validação, por que devo / devo usar o ApplicationRules?
Como posso definir no ApplicationRule QUANDO a regra deve ser aplicada apenas em uma ação específica (nem todas as chamadas de criação / atualização)?
Também não vejo ou entendo o benefício dos dois estados de validação separados quando a entidade é manipulada após opatchEntity
-ligar.
Caso eu adicione alguns valores automaticamente à entidade, quero ter certeza de que todos os valores ainda são válidos antes de salvá-los no banco de dados (como no CakePHP2). Então eu acho que é melhor / necessárioSEMPRE Usando validação como regras de aplicativo?!
Como você está lidando com isso em geral? Existem outros exemplos disponíveis para mostrar / demonstrar o benefício e alguns casos de uso do Validation vs. ApplicationRules?