2012-02-11 6 views
22

क्या कोई सहमति है कि PHP अनुप्रयोग में प्लगइन्स को कैसे कार्यान्वित किया जाना चाहिए?PHP अनुप्रयोगों में प्लगइन को लागू करने के लिए डिज़ाइन पैटर्न

मैंने observer pattern को देखा है जो करीब आता है, यह वास्तव में केवल एक अधिसूचना प्रणाली है और कोड को सीधे एप्लिकेशन को विस्तारित करने की अनुमति नहीं देता है।

public function registerHook($hookName, array $params = array()) 
{ 
    $this->hooks[] = $hookName; 

    foreach ($this->plugins as $pluginName => $hooks) { 
     if (in_array($hookName, $hooks)) { 
      $plugin = new $pluginName($this, $this->view, $this->controller); 

      $plugin->{$hookName}($params); 
     } 
    } 
} 

यह मेरी प्रयोजनों के लिए अच्छी तरह से काम करता है लेकिन मैं उत्सुक हूँ वहाँ एक डिजाइन पैटर्न है कि अगर बाहर वहाँ है कि परीक्षण किया है और कई बार साबित हो चुका है और: मैं वर्तमान में एक सरल हुक प्रणाली है कि मैं के साथ आया था का उपयोग कर रहा मैं सिर्फ पहिया का पुन: आविष्कार कर रहा हूं।

+0

मैं यह देखने का सुझाव दूंगा कि यह वर्डप्रेस के साथ कैसे काम करता है। मैं खुद को नहीं जानता, लेकिन मुझे लगता है कि यह हुक का उपयोग कर रहा है, और बॉय वर्डप्रेस में प्लगइन का एक टन है। अच्छा सवाल, ऊपर उठाया। – Relequestual

+0

@ रिलेक्वेस्टुअल मैं वर्डप्रेस से परिचित हूं, वे "क्रियाओं" के साथ एक प्रक्रियात्मक दृष्टिकोण लेते हैं। http://codex.wordpress.org/Function_Reference/add_action –

+0

मैं यह कहने जा रहा हूं कि यह प्रश्न डुप्ली नहीं है, लेकिन किसी भी तरह से यह प्रकार है। लगता है कि आम सहमति पर चर्चा की गई थी http://stackoverflow.com/questions/42/best-way-to-allow-plugins-for-a-php-plication – Relequestual

उत्तर

8

सिल्वर बुलेट भावना में कोई आम सहमति नहीं है। स्थापित पैटर्न के लिए, आप

कुछ नाम हैं।

जो आप उपयोग करते हैं वह आपके ऊपर है, लेकिन आपको यह सुनिश्चित करना चाहिए कि आपका सिस्टम आर्किटेक्चर मॉड्यूलरिटी का समर्थन करता है। कुछ विचार

+0

@ गॉर्डन मुख्य 'एप्लिकेशन' ऑब्जेक्ट (जैसे सिलेक्स है) को सजाने के बारे में आप क्या सोचते हैं, इसमें अपने संशोधन कर रहे हैं, फिर इसे वापस कर रहे हैं? फिर आप बार-बार इन्हें सजाने के लिए, प्रत्येक नए एप्लिकेशन संशोधन के लिए और अधिक सजावट जोड़ सकते हैं, और शेष को प्रभावित किए बिना किसी भी समय किसी को हटाने में सक्षम हो सकते हैं? – Jimbo

+0

@ जिम्बो निश्चित रूप से, अगर आप यही करना चाहते हैं। लेकिन ध्यान रखें कि एक सजावट आमतौर पर सजाए गए वर्ग के मौजूदा एपीआई पर ही काम करता है। आप [सिलेक्स 'पहले() 'और' बाद() 'हुक] का उपयोग भी कर सकते हैं (http://silex.sensiolabs.org/doc/middlewares.html)। – Gordon

1

वाईआई ढांचे पर एक नज़र डालें। वाईआई उन घटनाओं पर भारी निर्भर करता है जो हुक, क्रिया आदि से ज्यादा क्लीनर हैं। घटनाओं का उपयोग करके, आप सिस्टम के विभिन्न हिस्सों को ऑब्जेक्ट उन्मुख तरीके से एक-दूसरे से बात करने की अनुमति दे सकते हैं।

+0

मैं वास्तव में कोड उदाहरणों की तलाश नहीं कर रहा हूं लेकिन मुझे एक नज़र दिखाई देगी, धन्यवाद। –

0

ठीक है, में jin-plugin नामक प्रोजेक्ट का एक लिंक है। मैं पहली बार इस ढांचे को देख रहा हूं, लेकिन, शायद, आप इसे तुरंत इस्तेमाल कर सकते हैं।

इसके अलावा, आपको वास्तव में "प्लगइन पैटर्न" जैसी चीज़ों के लिए Google होना चाहिए, मुझे पहले पृष्ठ पर केवल दो लिंक मिले हैं: Plug-in Pattern, Extensibility pattern (wikipedia)

यदि यह वास्तव में एक पैटर्न है, तो यह भाषा अज्ञेयवादी होना चाहिए, ताकि आप सुरक्षित रूप से किसी भी भाषा से मौजूदा समाधान ले सकें और इसे PHP में परिवर्तित कर सकें।

पी एस प्रश्न के लिए धन्यवाद, वैसे भी, आपने वास्तव में इस विषय में अपनी रुचि बढ़ा दी है। ;)

1

Zend फ्रेमवर्क dispatchLoopStartup() और dispatchLoopShutdown() वर्ग तरीके के रूप में हुक उपयोग कर रहा है के लिए इन स्लाइड पर एक नज़र डालें। प्रत्येक प्लगइन एक वर्ग है जो उपर्युक्त तरीकों को लागू करता है।

ZF manual reference

1

जिस तरह से आप यह कर लेते हैं, हुक के साथ मैं यह कैसे लागू भी है।

हालांकि आपके नमूने के साथ सबसे बड़ी समस्या यह है कि आपका फ़ंक्शन प्लगइन को तुरंत चालू करता है। प्लगइन का उदाहरण क्यों न दें?

जिस तरह से मैंने यह किया है, यह है कि एक प्लगइन पहले तत्काल हो जाता है, और अपने हुक खुद को पंजीकृत करता है।

+0

एक प्लगइन कई हुक लागू कर सकता है, प्रत्येक साझा करने के लिए एक नया उदाहरण बना सकता है। –

+0

साझा स्थिति कुछ ऐसा है जो प्लगइन को स्वयं ही अवगत होना चाहिए। यदि आपको अलग-अलग राज्यों की आवश्यकता है, तो एकाधिक ऑब्जेक्ट्स का उपयोग करें। – Evert

+0

हालांकि यह एक मुद्दा क्यों है?यह हुक कार्यान्वयन को अलग रखता है और प्लगइन उदाहरणों का ट्रैक रखने की कोई आवश्यकता नहीं है। –

3

मुझे लगता है कि एक ईवेंट डिस्पैचर प्लगइन को लागू करने के लिए एक अच्छा और साफ तरीका है, या उस मामले के लिए कोई एक्सटेंशन है। एक इवेंट डिस्पैचर पर्यवेक्षक पैटर्न का कार्यान्वयन है, और सिम्फनी, Symfony2 और Zend Framework 2 (बीटा) में उपयोग किया जा रहा है।

गीथब पर उस स्रोत के किसी भी स्रोत को देखकर कुछ दिलचस्प पढ़ने के लिए तैयार किया जाएगा। हालांकि, जानकारी का एक दिलचस्प बिट यहां पाया जा सकता:

http://components.symfony-project.org/event-dispatcher/trunk/book/02-Recipes

मैं एक घटनाक्रम और हुक वर्ग में कुछ साल पहले एक परियोजना के लिए लिखा था, मुझे लगता है कि यहाँ पोस्ट अगर मैं इसे पा सकते हैं करेंगे।

+0

मुझे लगता है कि आपको यह कभी नहीं मिला :) – kaiser

+0

हाँ, उसने कभी यह नहीं पाया :-) – Jimbo

+1

नहीं, इसे कभी नहीं मिला । :) – lshepstone