Frage

Ich bin neu in Lehre 2 (und Ausnahmen in PHP, wirklich), aber ich versuche, mit einem robusten Validierungsmaschine zu kommen auf Lehre 2 (oben auf CodeIgniter) nach diese Seite .

Im Moment bin ich frage mich, wo ich die ValidateException Klasse definieren würde, und wie man ‚versuchen‘ tun ein save (beharren?) Auf meiner Einheit (von einer Steuerung, Bibliothek usw.).

Ich mag etwas haben, wo, nachdem dies zu tun (in einer ‚Authentifizierung‘ Bibliothek, zum Beispiel):

$user->username = $username;
$user->email_address = $email_address;
$user->password = $password;

$em->persist($user);
$em->flush();

return $foo; //where $foo refers to whether $em->flush() worked...

Ich konnte einfach zurückgeben, ob diese Beharrlichkeit erfolgreich war (das heißt, übergeben Validierung und gespeichert) oder nicht erfolgreich (das heißt, Fehler bei der Überprüfung).

War es hilfreich?

Lösung

ich glaube, Sie haben einen Benutzer Factory aussehen wollen. Sie könnten Methoden, die eine Reihe von Daten übernehmen (von Post Form) und ein User-Objekt zurück. Auf diese Weise können Sie den gesamten Prozess der Erstellung eines neuen Benutzerobjekt für die Verwendung in Ihrer Anwendung (und verharrt auf Ihrem Datenspeicher) einzukapseln. Sie können in diesem einzigen Ort alle Ihre try / Fänge tun und alle Ihre Controller rufen nur diese eine Funktion (Code wird in allen Ihren Controller nicht gestreut).

class UserFactory
{
  /** @var Doctrine Entity Manager */
  private $_em;

  function __construct(EntityManager $em) {
    $this->_em = $em;
  }

  function createUserFromArray($data) {
    $user = new User();
    $user->setUsername($data['username']);
    $user->setEmail($data['email']);

    $this->_em->persist($user);
    $this->_em->flush(); // Or this could be called from some other place

    return $user;
  }
}

Dann in Ihrem Controller alles, was Sie tun, ist so etwas wie folgt aus:

// Get the EntityManger from wherever (registry, session, etc)
$userFactory = new UserFactory($em);
$user = $userFactory->createFromArray($dataFromForm);

Zwei Dinge zusätzliche Dinge.

Ein, wenn Sie verwenden explizite Getter und Setter für Ihre Eigenschaften (Benutzername und E-Mail) Sie Ausnahmen in diesen Funktionen werfen können, wenn sie nicht den Kriterien entsprechen.

In Ihrer Benutzerklasse:

function setEmail($email) {
  // Do some validations on the email address
  if (!is_valid_email($email)) {
    throw new Exception('Invalid Email');
  }
  $this->email = $email;
}

Zwei, ich denke, das ist die Frage, die Sie wirklich fragen sind über den Lebenszyklus Rückrufe. Sie definieren die auf / in Ihr Modell / Entity Klassen selbst.

class User
{
  /** @PrePersist @PreUpdate */
  function ensureUniqueEmail()
  {
    // Do your check, else throw exception
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top