如何处理Doctrine 2验证的异常

时间:2010-09-05 03:28:29

标签: php validation exception codeigniter doctrine-orm

我是Doctrine 2的新手(实际上是PHP中的例外),但是我试图在this page之后在Doctrine 2(在CodeIgniter之上)提出一个强大的验证引擎。

现在我想知道我将在哪里定义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...

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

1 个答案:

答案 0 :(得分:4)

我想你可能想看一下用户工厂。您可以拥有获取数据数组的方法(来自表单的POST)并返回User对象。这使您可以封装创建新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;
}

二,我认为这是你真正要问的关于生命周期回调的问题。您可以在Model / Entity类中定义它们。

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