2011-05-21 10 views
6

मैं सत्यापन के साथ एक समस्या है। सिद्धांत 1 में मैंने इसका उपयोग किया:सिद्धांत 2 सत्यापन

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

और $ त्रुटि में स्टैक मुझे कॉलम का नाम और त्रुटि संदेश मिला। लेकिन सिद्धांत 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()); 
} 

लेकिन मैं दो समस्याएं हैं यह कण:

  • मुझे नहीं पता कौन सा कॉलम?
  • मैं अद्वितीय जाँच करने के लिए नहीं करना चाहती मैन्युअल

मैं इकाई से सत्यापित करें() अद्वितीय catched किया जाएगा (यह error.log से)

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

लेकिन उदाहरण के उपयोगकर्ता के लिए छोड़ देते हैं 2 रिकॉर्ड्स को सहेजें और पहला गलत है, लेकिन दूसरा वैध, एंटिटी मैनेजर को पहले सेव करने के बाद बंद हो जाएगा और मैं "EntityManager बंद है" के कारण दूसरे (अच्छे) रिकॉर्ड को सहेज नहीं सकता।

कौन इस समस्या के लिए सबसे अच्छा समाधान है? जाँच http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html#preupdate श्रोताओं के आधार पर सत्यापन,, ValidCreditCardListener उदाहरण - - - एक इकाई से संबंधित व्यापार तर्क के रूप में आप अपनी पोस्ट में वर्णित सत्यापन तीसरे पक्ष के पुस्तकालयों के आधार पर, कुछ:

उत्तर

3

डी 2 में सत्यापन करने के लिए कुछ तरीके हैं इसी तरह वर्णित: 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() 
    { 
     ... 
    } 
}