[英]Doctrine 2 validation
我有验证问题。 在Doctrine 1中我使用了这个:
if ($model->isValid()) {
$model->save();
} else {
$errorStack = $model->getErrorStack();
...
}
并在$ errorStack中我得到了列名和错误消息。 但是在Doctrine 2中我可以使用它:
实体
/**
* @PrePersist @PreUpdate
*/
public function validate()
{
if ($this->name == null)) {
throw new \Exception("Name can't be null");
}
}
控制器:
try {
$user = new \User();
//$user->setName('name');
$user->setCity('London');
$this->_entityManager->persist($user);
$this->_entityManager->flush();
} catch(Exception $e) {
error_log($e->getMessage());
}
但我有两个问题:
如果我从实体中跳过validate(),那么将捕获唯一(来自此error.log)
Unique violation: 7 ERROR: duplicate key value violates unique constraint "person_email_uniq"
但是例如用户保存2条记录,第一条是错误的,但第二条有效,第一次保存后EntityManager将关闭,因为“EntityManager已关闭”,我无法保存第二条(好)记录。
哪个是这个问题的最佳解决方案?
在D2中进行验证的方法很少: - 与您在基于听众的验证后描述的一个实体相关的业务逻辑,请查看http://www.doctrine-project.org/docs/orm/2.0/en/ reference / events.html #preupdate ,ValidCreditCardListener示例 - 基于第三方库的验证,类似于此处描述的内容: Zend_Validate_Db_RecordExists with Doctrine 2? 和Zend_Validate:带有Doctrine的Db_NoRecordExists如果您使用特定的框架进行表单呈现,则可以将验证集成到其中。
我在实体中使用了与一个实体相关的业务逻辑验证:
/**
* @PrePersist @PreUpdate
*/
public function validate()
{
$this->errors = array();
if ($this->name == null)) {
$this->errors['name'][] = 'Something wrong';
}
if (0 < count($errors)) {
throw new Exception('There are errors');
}
}
public function getErrors()
{
return $this->errors;
}
和监听器验证强制一些规则,如唯一性,因为在我的应用程序中,实体不仅可以基于表单创建。
请记住在实体中定义@HasLifecycleCallbacks。
/**
* @Entity @Table(name="songs") @HasLifecycleCallbacks
*/
class Song
{
...
/** @PrePersist @PreUpdate */
public function doStuffOnPreUpdatePrePersists()
{
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.