我想你可能想看看有一个用户工厂。您可以使用获取数据数组(来自表单的 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
}
}