Confusing Validation vs. Application Rules in CakePHP3

Mehrere Fragen zur Validierung, die zusammengehören können, weil sie sich alle mit dem neuen Validierungskonzept in CakePHP 3 befassen.

Ich habe die Kapitel gelesen 1, 2, 3) mehrmals im Kochbuch, aber ehrlich gesagt verstehe ich nicht, wie man es richtig macht. Ich weiß auch, dass es momentan ein @ gib Ausgabe / Diskussion bei GitHub über die Validierung in CakePHP3, die sich möglicherweise mit demselben Thema befasst.

Validierungsfehler werden z.B. mit patchEntity. Ich würde also denken, dass es besser ist, IMMER Fehler zu überprüfen / anzuzeigen, BEVOR die Sicherungsaktion ausgeführt wird:

// 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);
}

Warum verwenden die Kochbuch-Tutorials nicht$user->errors() vor dem Speichern von Daten? Soweit ich es verstehesave muss nicht aufgerufen werden, wenn bereits ein Validierungsfehler aufgetreten ist ?! Eine andere Möglichkeit wäre, die Fehlerprüfung und die Speicheraktion zu kombinieren:

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.');
}

Verwenden Sie das? Soll ich es benutzen? Oder wenn nicht, warum nicht?

Warum zeigt CakePHP die Validierungsfehler an, auch wenn ich NICHT @ benut$user->errors() in der Steuerung, wie in allen Kochbuchbeispielen? Ich dachtesave überprüft NICHT die Entitätsvalidierung?!

Beispiel: isUnique

Laut demKochbuc "Sicherstellen der Eindeutigkeit von E-Mails" ist ein Anwendungsfall für Anwendungsregeln.

// 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;
}

Der Fehler würde nur mit einem @ ausgelösave -Anruf in der Steuerung. Es ist aber auch möglich, die Eindeutigkeit in der Validierung zu überprüfen. Warum ist es besser, es NICHT so zu machen?

// 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;
}

Wenn ich die ApplicationRule zur Validierung hinzufügen kann, warum sollte ich ApplicationRules überhaupt verwenden?

Wie kann ich in der ApplicationRule definieren, WANN die Regel nur in einer bestimmten Aktion angewendet werden soll (nicht alle Aufrufe zum Erstellen / Aktualisieren)?

Ich sehe oder verstehe auch nicht den Vorteil der beiden getrennten Validierungszustände, wenn die Entität nach dem @ manipuliert wirpatchEntity-Anruf

Wenn ich der Entität einige Werte automatisch hinzufüge, möchte ich sicherstellen, dass alle Werte noch gültig sind, bevor ich sie in der Datenbank speichere (wie in CakePHP2). Also würde ich raten, dass es besser / notwendig ist,IMME Validierung als Anwendungsregel verwenden?!

Wie gehst du im Allgemeinen damit um? Gibt es andere Beispiele, um den Nutzen und einige Anwendungsfälle der Validierungs- oder Anwendungsregeln zu demonstrieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage