2010-02-02 11 views
28

मुझे लगता है कि निष्पादन के आदेश init है(), preDispatch() और फिर कार्रवाई() कहा जाता है।Zend फ्रेमवर्क: नियंत्रक वस्तुओं में init() और preDispatch() कार्यों के बीच क्या अंतर है?

  1. क्या मुझे अपने चर को प्रारंभ करना चाहिए, जो सभी कार्यों में init() या preDispatch() में आम हैं? मैंने लोगों को प्रारंभिकरण के लिए दोनों कार्यों का उपयोग करके देखा है। नाम यह init में किया शायद के रूप में पता चलता है की जानी चाहिए() लेकिन फिर सामान की किस तरह preDispatch में जाना होगा()?

  2. क्या init() और preDispatch() फ़ंक्शन कॉल के बीच होता है?

+0

क्या आप नियंत्रक वस्तुओं के बारे में बात कर रहे हैं? –

+0

@Emil: मैंने सवाल संपादित किया है। यह अब स्पष्ट होना चाहिए। – understack

उत्तर

28

पहले preDispatch()Zend_Controller_Plugin_Abstract की घटनाओं के लिए कहा जाता है। यहां आपके पास अनुरोध और प्रतिक्रिया वस्तुएं हैं, इसलिए आप अनुरोध को फ़िल्टर कर अनुरोध कर सकते हैं या अनुरोध से जानकारी का उपयोग कर कुछ तैयारी कर सकते हैं।

Zend_Controller_Action की init() निर्माता के हिस्से के रूप में अगले कहा जाता है। यह ओवरराइड और निर्माता (Zend_Controller_Action::__contruct()) के हस्ताक्षर को दोहराने के लिए बिना, आप अपने नियंत्रक को प्रारंभ करने में मदद करने नहीं है।

नियंत्रक के preDispatch() विधि यहाँ कहा जाता है। यकीन नहीं करता है, तो आप कर सकते हैं कि init()

में फिर अपने कार्रवाई विधि कहा जाता है (viewAction() उदाहरण के लिए) - आप वर्तमान कार्रवाई को छोड़ $request->setDispatched(false) कॉल कर सकते हैं। यहां आप मॉडल से सामान लाने और दृश्य को पॉप्युलेट करने जैसे अपना सामान्य काम करते हैं।

तो भेद अब स्पष्ट होना चाहिए:

  • आप कुछ सभी कार्यों से पहले क्रियान्वित किया जा करना चाहते हैं - यह एक प्लगइन में डाल दिया और हुक से एक का उपयोग (preDispatch() के अलावा वहाँ routeStartup और others),
  • यदि आप एक नियंत्रक में हर क्रिया से पहले चाहते हैं - init या preDispatch(),
  • अगर एक भी कार्रवाई के लिए केवल - कार्रवाई में ही।

क्या init() और preDispatch() समारोह कॉल के बीच होता है?

लगभग कुछ भी नहीं है - preDispatch() निष्पादित किया जाता है, और यदि आप $request->setDispatched(false) बुलाया नहीं किया है, कार्रवाई निष्पादित किया जाता है।

+0

यह भी देखें कि http://framework.zend.com/manual/en/zend.controller.plugins.html – Gordon

+2

'यदि आप नियंत्रक में प्रत्येक कार्रवाई से पहले चाहते हैं - init या preDispatch() वास्तव में, आपने उत्तर नहीं दिया है प्रश्न खुद ही संरचनात्मक बिंदु से, ** एकल नियंत्रकों ** पर, जब init() preDispatch() (प्लगइन नहीं) के बजाय उपयोग किया जाना चाहिए? उदाहरण के लिए: हम प्रीडिस्चैच में अजाक्सकॉन्टेक्स्ट सहायक का उपयोग नहीं करते हैं, लेकिन init()। तो दोनों के बीच वैचारिक अंतर कौन सा है? तकनीकी नहीं यदि आप समझते हैं कि मेरा क्या मतलब है। यदि आप बस एक या दूसरे का उपयोग कर सकते हैं, तो कोई फर्क नहीं पड़ता। लेकिन मुझे लगता है कि कुछ है। –

+0

'AJAXContext' के बारे में बस एक युक्ति जब मैं एकल नियंत्रकों पर उदाहरण देखता हूं तो दस्तावेज़ों का जिक्र कर रहा हूं: http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller .actionhelpers.contextswitch.ajaxcontext –

0

init(): कार्यों से पहले लोड किया गया, तो अगर आप इस परियोजना के सभी कार्यों को करने से पहले इसे लोड करना चाहते हैं, बूटस्ट्रैप कक्षा में यह रखो। यदि किसी निर्दिष्ट वर्ग फ़ंक्शंस से पहले, इसे इस क्लास फ़ंक्शन पर init() पर रखें।

preDispatch(): सामने नियंत्रक से पहले लोड हो गया।

9
  • init() विधि मुख्य रूप से निर्माता देने के लिए करना है। आम तौर पर, आपके कन्स्ट्रक्टर को ऑब्जेक्ट स्टेटस सेट करना चाहिए, और अधिक तर्क नहीं करना चाहिए। इसमें नियंत्रक में उपयोग किए जाने वाले संसाधनों को प्रारंभ करना शामिल हो सकता है (जैसे मॉडल, कॉन्फ़िगरेशन ऑब्जेक्ट इत्यादि।), या फ्रंट कंट्रोलर, बूटस्ट्रैप, या रजिस्ट्री से पुनर्प्राप्त मान असाइन करना।

  • preDispatch() विधि भी वस्तु या पर्यावरण (जैसे, देखने के लिए, कार्रवाई सहायक, आदि) राज्य स्थापित करने के लिए इस्तेमाल किया जा सकता है, लेकिन इसका प्राथमिक उद्देश्य के बारे में क्या है या नहीं अनुरोध की गई कार्रवाई को भेजा जाना चाहिए निर्णय लेने के लिए है। यदि नहीं, तो आपको _forward किसी अन्य कार्रवाई में, या अपवाद फेंकना चाहिए।


नोट: _forward वास्तव में सही ढंग जब init() है, जो दो विधियों के इरादों की एक औपचारिक है से निष्पादित काम नहीं करेगा।

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