2011-09-03 27 views
14

में ज़ेंड प्रीडिस्चैच विधि जैसे कुछ कैसे बनाएं I सिम्फनी 2 का उपयोग करके एक प्रोजेक्ट बना रहा हूं और मुझे ज़ेंड में प्रीडिस्चैच जैसी विधि की आवश्यकता है जिसे नियंत्रक में किसी भी कार्रवाई से पहले बुलाया जाएगा। मैं सिम्फनी में बहुत नया हूं और नेट सर्फिंग थोड़ा सा है, मैंने पाया है कि सिम्फनी के पुराने संस्करणों में एक प्रीएक्सक्यूट विधि थी लेकिन अब यह खत्म हो गया है। मैं अपनी समस्या का समाधान करने के लिए क्या उपयोग कर सकता हूं?सिम्फनी 2

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

उत्तर

10

सिम्फनी 1 की प्रीएक्सक्यूट() विधि ने इसे बहुत आसान बना दिया, लेकिन जैसा कि आपने कहा, यह सिम्फनी 2 में उपलब्ध नहीं है। सौभाग्य से, सिम्फनी 2 में आपके पास घटनाओं तक पहुंच है। ढांचा आपके आवेदन के जीवन चक्र के दौरान कई घटनाओं को भेजता है। प्रेषित घटनाओं के की कुछ की सूची यहां दी गई है - http://symfony.com/doc/2.0/book/internals.html#events

आप वेब डीबग टूलबार का उपयोग यह देखने के लिए भी कर सकते हैं कि कौन सी घटनाएं भेजी जा रही हैं, और कक्षाएं (ईवेंट लिस्टेनर्स) जो घटना को सुन रहे हैं। यदि आप इससे परिचित नहीं हैं तो उपर्युक्त लिंक पूरी घटना प्रणाली के बारे में विस्तार से भी जाता है।

दुर्भाग्य से मुझे खुद को प्रीएक्सक्यूट कार्यक्षमता की नकल करने की आवश्यकता नहीं है, इसलिए मुझे नहीं पता कि आपको किस घटना को सुनने की आवश्यकता होगी, लेकिन मुझे यकीन है कि दस्तावेज़ों को पढ़कर आप जो भी चाहते हैं उसे ठीक से समझ लेंगे ।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद एक बहुत अपने सुझाव के लिए यह, मुझे बहुत मदद की। – haynar

18

जैसा कि @ एआरएमएस ने मुझे सुझाव दिया है, मैंने सिम्फनी 2 की घटना तंत्र की खोज शुरू कर दी है। तो अब मैं कोड लिखने वाला हूं, जिसने मेरी समस्या हल की है (सभी कॉन्फ़िगरेशन मैं वाईएएमएल में कर रहा हूं, लेकिन आप कर सकते हैं इसे एक्सएमएल या PHP में भी करें)।

सबसे पहले आपको सिम्फनी कॉन्फ़िगरेशन में वर्णन करने की आवश्यकता है कि आप किस तरह की घटना सुनना चाहेंगे और घटना होने पर कर्नेल को क्या कॉल करना चाहिए। इस खुले विन्यास फाइल अनुप्रयोग के लिए \ config \ config.yml और निम्न कोड जोड़ें:

services: 
    younamespace.yourbundle.listener.preexecute: 
     class: Location\Of\Your\Listener\Class 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

आपका वर्ग निम्नलिखित तरीके से onKernelController विधि को लागू करना चाहिए:

public function onKernelController(FilterControllerEvent $event) { 
    if(HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { 
     $controllers = $event->getController(); 
     if(is_array($controllers)) { 
      $controller = $controllers[0]; 

      if(is_object($controller) && method_exists($controller, 'preExecute')) { 
       $controller->preExecute(); 
      } 
     } 
    } 
} 

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

तुम भी (इस उदाहरण kernel.request घटना के लिए है, लेकिन यह आप को समझने में मदद कर सकते हैं)

मज़े विवरण here में विन्यास देख सकते हैं;)

+1

ध्यान दें कि नियंत्रक बंद हो सकता है, इसलिए आपको उस सरणी के पहले आइटम पर नियंत्रक पर 'is_array()' और 'is_object()' की जांच करनी चाहिए। – igorw

+0

हाँ :) आप सही हैं – haynar

+2

+1 बहुत अच्छा समाधान और स्पष्टीकरण! –