如何处理学说2验证的异常
-
01-10-2019 - |
题
我是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...
我可以简单地返回该持久性是否成功(即通过验证并保存),还是没有成功(即验证失败)。
解决方案
我认为您可能想考虑拥有一个用户工厂。您可以使用(从表单的帖子中)获取一系列数据并返回用户对象的方法。这使您可以封装创建新用户对象在应用程序中使用的整个过程(并持续到数据存储)。您可以在这个单个位置进行所有尝试/捕获,所有控制器只会调用此功能(代码并未散布在所有控制器中)。
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);
另外两件事。
首先,如果您使用明确的获取器和设置器作为您的属性(用户名和电子邮件),则可以在这些功能中不符合标准,在这些功能中抛出异常。
在您的用户类中:
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
}
}
不隶属于 StackOverflow