2012-04-27 12 views
9

मैंने इस ट्यूटोरियल से निर्देशों का पालन किया है: http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html, और एक साधारण श्रोता बनाया है, जो किसी इकाई के सम्मिलन या अद्यतन पर सिद्धांत द्वारा भेजे गए ईवेंट के लिए सुनता है। प्रीइंसर और पोस्टइन्सर्ट इवेंट ठीक काम करते हैं और एक नई इकाई के निर्माण पर प्रेषित होते हैं। हालांकि, preUpdate और postUpdate को इकाई के अद्यतन पर कभी भी बुलाया नहीं जाता है इससे कोई फर्क नहीं पड़ता। फ्लश पर भी यही है। एक साइड नोट के रूप में, मेरे पास एक कंसोल जेनरेट कंट्रोलर है जो मूल सीआरयूडी ऑपरेशंस का समर्थन करता है, और इसे बिना छूटे छोड़ दिया है।प्रीअपडेट और पोस्ट अपडेट ईवेंट घटनाओं पर ट्रिगर नहीं किए गए 2

नीचे कुछ कोड स्निपेट हैं जो मैं इसे करने के तरीके को प्रदर्शित करने के लिए कर रहा हूं।

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

श्रोता कार्यान्वयन (मैं अन्य कार्यों को छोड़ दिया और सादगी प्रयोजनों के लिए केवल postUpdate छोड़ दिया है)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

इकाई आईडी कभी नहीं प्रदर्शित किया जाता है, और स्क्रिप्ट के लिए जारी समारोह के अंत में मरने के बावजूद यह निष्पादन पूरा होने तक इसका निष्पादन पूरा हो गया है।

उत्तर

13

क्या आप @HasLifecycleCallbacks एनोटियन जोड़ना भूल गए? आप @PreUpdate एनोटेशन का उपयोग कर सकते हैं और सेवा परिभाषा को पूरी तरह से छोड़ सकते हैं।

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

मेरी राय में घटनाओं संलग्न की इस तरह से बहुत आसान आप नई सेवाओं और श्रोताओं स्पष्ट परिभाषित करने के लिए की जरूरत नहीं है के रूप में है। इसके अलावा आपके पास डेटा को अपडेट करने की प्रत्यक्ष पहुंच है क्योंकि यह विधि आपकी इकाई के भीतर स्थान है।

अब, दोष यह है कि आप अपने मॉडल के साथ तर्क मिश्रण है और वह कुछ है कि यदि संभव हो तो बचा जाना चाहिए है ...

आप जीवनचक्र के बारे में यहाँ कॉलबैक अधिक पढ़ सकते हैं: http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

सच ... लेकिन , मुझे अन्य संस्थाओं और इकाई प्रबंधक का उपयोग करना होगा, और संभवतः अन्य सेवाएं, इसलिए यह एक अच्छा विचार नहीं होगा। वैसे भी, ऐसा लगता है कि अब समस्या हल हो गई है। मैंने सिम्फनी के नवीनतम संस्करण में अपडेट किया, कैश साफ़ कर दिया, और सब कुछ काम कर रहा है। – tomor

+0

आह हाँ, अगर आप अन्य सेवाओं/संस्थाओं का उपयोग कर रहे हैं तो यह समझ में आता है कि इस तरह से नहीं जाना :) –