2011-05-21 156 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() 
    { 
     ... 
    } 
}