我在验证方面有问题。在原则1中,我使用了这样的方法:
if ($model->isValid()) {
$model->save();
} else {
$errorStack = $model->getErrorStack();
...
}在$errorStack中,我得到了列名和错误消息。但在原则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已关闭”,我无法保存第二条(很好)记录。
解决这个问题的最好办法是什么?
发布于 2011-11-17 20:01:53
在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: Db_NoRecordExists with Doctrine --如果您使用特定的表单呈现框架,则可以将验证集成到其中。
我在实体中使用验证来处理与一个实体相关的业务逻辑:
/**
* @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;
}以及监听器验证,强制执行一些规则,例如唯一性,因为在我的应用程序中,不仅可以基于表单创建实体。
发布于 2011-11-19 00:09:19
记住在实体中定义@HasLifecycleCallback。
/**
* @Entity @Table(name="songs") @HasLifecycleCallbacks
*/
class Song
{
...
/** @PrePersist @PreUpdate */
public function doStuffOnPreUpdatePrePersists()
{
...
}
}https://stackoverflow.com/questions/6082815
复制相似问题