3

我是 Doctrine 2 的新手(实际上是 PHP 中的例外),但我正在尝试在 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...

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

4

1 回答 1

4

我想你可能想看看有一个用户工厂。您可以使用获取数据数组(来自表单的 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
  }
}
于 2010-10-22T18:38:51.130 回答