2010-09-05 7 views
3

Je suis nouveau à Doctrine 2 (et les exceptions en PHP, vraiment), mais j'essaie de trouver un moteur de validation robuste sur Doctrine 2 (en plus de CodeIgniter), suivant this page .Comment gérer les exceptions sur la validation de Doctrine 2

En ce moment je me demande où je définirais la classe ValidateException, et comment "essayer" de faire une sauvegarde (persist?) Sur mon entité (à partir d'un contrôleur, une bibliothèque, etc).

Je voudrais avoir quelque chose où, après avoir fait cela (dans une bibliothèque « d'authentification », par exemple):

$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... 

je pourrais revenir simplement si cette persistance a réussi (c.-à-passé la validation et enregistré), ou pas réussi (c.-à-d., validation échouée).

Répondre

4

Je pense que vous voudrez peut-être envisager d'avoir une Usine Utilisateur. Vous pourriez avoir des méthodes qui prennent un tableau de données (à partir du POST d'un formulaire) et retournent un objet Utilisateur. Cela vous permet d'encapsuler tout le processus de création d'un nouvel objet Utilisateur à utiliser dans votre application (et persiste dans votre banque de données). Vous pouvez faire tous vos essais/captures dans cet endroit unique et tous vos contrôleurs appellent cela une seule fonction (le code n'est pas dispersé dans tous vos contrôleurs).

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

Ensuite, dans votre contrôleur tout ce que vous faites est quelque chose comme ceci:

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

Deux choses choses supplémentaires. Un, si vous utilisez des getters et des setters explicites pour vos propriétés (nom d'utilisateur et email) vous pouvez lancer des exceptions dans ces fonctions si elles ne répondent pas aux critères.

Dans votre classe User:

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

Deux, je pense que c'est la question que vous posiez vraiment est sur les callbacks du cycle de vie. Vous définissez eux-mêmes ceux sur/dans vos classes Model/Entity.

class User 
{ 
    /** @PrePersist @PreUpdate */ 
    function ensureUniqueEmail() 
    { 
    // Do your check, else throw exception 
    } 
} 
Questions connexes