2011-05-21 141 views
6

我有验证问题。在学说1我用这个:学说2验证

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已关闭”,我无法保存第二条(良好)记录。

哪个是这个问题的最佳解决方案?

回答

3

有办法少做验证在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; 
} 

和听众验证,因为在可以创建不仅是我的应用实体基础上的形式,迫使一些规则,例如唯一性。

2

请记住在实体中定义@HasLifecycleCallbacks。

/** 
* @Entity @Table(name="songs") @HasLifecycleCallbacks 
*/ 
class Song 
{ 
    ... 
    /** @PrePersist @PreUpdate */ 
    public function doStuffOnPreUpdatePrePersists() 
    { 
     ... 
    } 
}