如何处理的学说2验证

问题描述:

我新的学说2(和PHP中的例外,真的)例外,但我想拿出与学说2强大的验证引擎(对CodeIgniter的顶部),之后this page如何处理的学说2验证

现在我想知道在那里我会定义ValidateException类,以及如何“尝试”做一个保存在我的实体(坚持?)(从控制器,图书馆等)。

我想有一些地方,这样做(在“认证”库,例如)之后:

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

我可以简单地返回持久性是否成功(即,通过验证和保存)或不成功(即验证失败)。

我想你可能想看看有用户厂。您可以拥有一些方法(从表单的POST)获取数据数组并返回一个User对象。这使您可以封装创建新的用户对象的整个过程,以便在您的应用程序中使用(并保留到您的数据存储区)。你可以在这个地方做所有的尝试/捕获,并且你所有的控制器都会调用这一个功能(代码并不是分散在你的所有控制器中)。

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

然后在您的控制器,你要做的就是这样的事情:

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

两件事额外的东西。

之一,如果你使用显式getter和setter你的属性(用户名和电子邮件),您可以在这些函数中抛出异常,如果他们不符合标准。

在用户等级:

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

两个,我觉得这是你真正应该问的问题是关于生命周期回调。您可以在模型/实体类中定义它们。

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