2013-05-17 12 views
7

मुझे ट्रिगर करने के लिए कोई ईवेंट प्राप्त करने में कोई समस्या है। यहाँ मेरी कोड ...जेडएफ 2 इवेंट ट्रिगर

controller.php

function get($id) 
{ 
    $this->getEventManager()->trigger('hmac.check'); 
} 

जब यह ट्रिगर भाग गया है यह भले ही यह जुड़ा हुआ है hmac.check घटना नहीं चलेंगे है।

module.php

class Module 
{ 
    /** 
    * Init the methods 
    * 
    * @param ModuleManager $moduleManager 
    */ 
    public function init(ModuleManager $mm) 
    { 
     $mm->getEventManager() 
      ->attach(
       'hmac.check', 
       function(MvcEvent $evt) 
       { 
        echo "The trigger has worked"; 
        $key = $evt->getParams()->fromHeader('key'); 
        $ts = $evt->getParams()->fromHeader('when'); 
        $uri = $evt->getParams()->fromHeader('uri'); 

        $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage); 
       } 
     ); 
    } 
} 

तो मैं पहले या $ mm-> getEventManager-> देते हैं (के बाद) संदेश बाहर गूंज; यह परीक्षण ठीक प्रदर्शित करता है इसलिए मुझे पता है कि यह init विधि निष्पादित कर रहा है।

इससे कोई मदद अच्छी होगी।

अग्रिम धन्यवाद

संपादित में: यह एक आरामदायक नियंत्रक है कि यदि कोई फर्क नहीं पड़ता (मैं नहीं लगता कि यह करता है)।

उत्तर

9

समस्या यह है कि आप श्रोताओं को ModuleManager s EventManager उदाहरण से जोड़ रहे हैं, और मुख्य Application EventManager नहीं।

मॉड्यूल init() से सीधे एप्लिकेशन इवेंट मैनेजर से अटैचमेंट करने का कोई तरीका नहीं है, मॉड्यूल मैनेजर के पास इसका उपयोग नहीं है, इसलिए आपको ModuleManager के EventManager से ShareManager प्राप्त करने की आवश्यकता है और अपने ईवेंट श्रोताओं को उस अटैचमेंट से जोड़ना होगा ।

hmac.check ईवेंट को सुनकर ऐसा करने का एक उदाहरण यहां दिया गया है जब Zend\Mvc\Controller\AbstractRestfulController तक फैले किसी भी नियंत्रक द्वारा ट्रिगर किया गया है, लेकिन आप इसे अपने नियंत्रक FQCN के साथ बदलकर एक विशिष्ट नियंत्रक को सुन सकते हैं।

class Module 
{ 
    /** 
    * Init the methods 
    * 
    * @param ModuleManager $moduleManager 
    */ 
    public function init(ModuleManager $mm) 
    { 
     $mm->getEventManager()->getSharedManager() 
      ->attach(
       'Zend\Mvc\Controller\AbstractRestfulController', 'hmac.check', 
       function(MvcEvent $evt) 
       { 
        echo "The trigger has worked"; 
        $key = $evt->getParams()->fromHeader('key'); 
        $ts = $evt->getParams()->fromHeader('when'); 
        $uri = $evt->getParams()->fromHeader('uri'); 

        $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage); 
       } 
     ); 
    } 
} 
+2

धन्यवाद, यह एक इलाज करता है :) – mic

+1

आप यह कैसे काम करते हैं? मुझे निम्न त्रुटि मिली: क्लोजर को पास करने के लिए पास किया गया तर्क 1 ज़ेंड \ Mvc \ MvcEvent का उदाहरण होना चाहिए, उदाहरण के लिए – emolah

+1

@emolah दिए गए ज़ेंड \ ModuleManager \ ModuleEvent का उदाहरण होना चाहिए, अगर आपको मॉड्यूलवेवेंट उदाहरण मिल रहा है, तो मैं केवल यह मान सकता हूं कि आपने कॉपी की है उत्तर में दिए गए कोड के बजाय प्रश्न में इस्तेमाल किया गया कोड। – Crisp

संबंधित मुद्दे