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?

questionAnswers(1)

yourAnswerToTheQuestion