2011-05-21 18 views
6

Doğrulama ile ilgili bir sorunum var. Doktrin 1'de ben bu kullandı:Doctrine 2 doğrulama

if ($model->isValid()) { 
    $model->save(); 
} else { 
    $errorStack = $model->getErrorStack(); 
    ... 
} 

$ ve errorStack i sütun adı ve hata mesajı var. Ama Doktrin 2'de bunu sadece kullanabilirsiniz:

Varlık

/** 
* @PrePersist @PreUpdate 
*/ 
public function validate() 
{ 
    if ($this->name == null)) { 
     throw new \Exception("Name can't be null"); 
    } 
} 

Denetleyici:

try { 
    $user = new \User(); 
    //$user->setName('name'); 
    $user->setCity('London'); 
    $this->_entityManager->persist($user); 
    $this->_entityManager->flush(); 
} catch(Exception $e) { 
    error_log($e->getMessage()); 
} 

ama iki sorun var bunu katiyen:

  • bilmiyorum hangi sütun
  • i benzersiz kontrol etmek istemiyoruz elle

i (bu error.log itibaren) catched edilecek benzersiz varlıktan validate()

Unique violation: 7 ERROR: duplicate key value violates unique constraint "person_email_uniq" 

ancak örneğin kullanıcı için atlarsanız 2 kayıt kaydedin ve birincisi yanlıştır, ancak ikincisi, EntityManager'ın ilk kaydedilmesinden sonra kapanacaktır ve "EntityManager kapalı" olduğundan dolayı ikinci (iyi) kaydı kaydedemiyorum.

Bu sorun için en iyi çözüm hangisidir?

cevap

3

D2 doğrulama yapmak birkaç yolu vardır: - Eğer yazı açıklandığı gibi iş mantığı bir varlık ile ilişkili - doğrulama dinleyici dayalı http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html#preupdate kontrol ValidCreditCardListener örnek - doğrulama üçüncü parti kütüphaneleri dayalı bir şey Burada açıklandığı gibi: Zend_Validate_Db_RecordExists with Doctrine 2? ve Zend_Validate: Db_NoRecordExists with Doctrine Form oluşturma için belirli bir çerçeve kullanırsanız, doğrulamayı ona entegre edebilirsiniz.

Bir kuruluşa ilişkin iş mantığı için kuruluşlar doğrulama kullandı: başvurum kişiler sadece oluşturulabilir içinde formlara göre çünkü

/** 
* @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; 
} 

ve dinleyici doğrulama böyle teklik gibi bazı kurallar zorlamak için.

2

Varlıktaki @HasLifecycleCallbacks tanımlamayı unutmayın.

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