2012-01-13 16 views
7

मैं विभिन्न प्रकार के पृष्ठों को प्रस्तुत करने के लिए सरल सेवा बनाने की कोशिश कर रहा हूं।Symfony2 में रणनीति पैटर्न

$somePageType = new PageType(...); 
$this->get('page.service')->render($somePagetype); 

... जो Strategy pattern के रूप में तैयार किया जाएगा: मूल अवधारणा की तरह कुछ हो रही है। पेज प्रकार render विधि के साथ इंटरफ़ेस को लागू करेंगे और page.service इसे कॉल करेंगे। समस्या यह है कि मैं पेज प्रकार कक्षाओं में सिद्धांत का उपयोग करना चाहता हूं। मेरे लिए यहां क्या विकल्प हैं? मैं इन वर्गों में से प्रत्येक के लिए सेवा बनाने से बचना चाहता हूं। क्या यह भी संभव है? क्या उन्हें बिना किसी सेवा के कंटेनर को जागरूक करना संभव है? संभवतः, भविष्य में, कुछ पेज प्रकार को केवल सिद्धांत से कुछ और चाहिए, इसलिए मुझे यह भी ध्यान में रखना होगा।

उत्तर

1

मुझे लगता है कि PageType एक रणनीति वर्ग का एक उदाहरण है। उस स्थिति में, आप page.service द्वारा निर्भरताओं को इंजेक्ट कर सकते हैं और आपको रणनीतियों को सेवाओं के रूप में परिभाषित करने की आवश्यकता नहीं होगी।

प्रत्येक रणनीति शायद विभिन्न वस्तुओं पर निर्भर करती है और इसलिए मुझे लगता है कि आप उन्हें ContainerAware बना सकते हैं। यहाँ एक उदाहरण है कि यह कैसे

// This is the page.service class 
class MyPageService { 

    public function render(PageTypeInterface $page_type) { 
     $page_type->setContainer($this->container); 

     // do stuff 
    } 
} 

// This is the type strategy 
class MyStrategyType extends ContainerAware implements PageTypeInterface { 
    // you can access the container after MyPageService has injected it. 
} 

तो मूल रूप से प्रत्येक रणनीति ContainerAware प्रदान करेगा करने के लिए और page.service कंटेनर डालेगी है।


संपादित

अपने रणनीतियों के सभी एक ही सेवाओं पर निर्भर हैं, तो मैं उन्हें बजाय पूरे कंटेनर के इंजेक्षन चाहते हैं।

class MyPageService { 

    public function render(PageTypeInterface $page_type) { 
     $page_type->setService($this->container->get('my_service')); 

     // do stuff 
    } 
} 
+0

कंटेनर को पास करने के लिए कोई अच्छा नहीं है। यदि उसके ऑब्जेक्ट को सिद्धांत की आवश्यकता है, तो उसे डॉक्टर ऑब्जेक्ट के लिए कन्स्ट्रक्टर में पैरामीटर जोड़कर इसकी आवश्यकता होनी चाहिए। – meze

+0

बेशक @meze, लेकिन क्या होगा यदि प्रत्येक रणनीति में विभिन्न निर्भरताएं हों। यह एकमात्र रास्ता होगा। हालांकि, मैं व्यक्तिगत रूप से सभी रणनीतियों को सेवाओं के रूप में परिभाषित करता हूं। – gilden

+0

और आप अपनी रणनीतियों का परीक्षण कैसे करेंगे? सिम्फनी के बिना किसी अन्य परियोजना में पुन: उपयोग करें? – meze

3

सेवाएं वही हैं जो आप यहां चाहते हैं। प्रश्न में विशेष रणनीति के लिए निर्भरताओं को इंजेक्ट करने में सक्षम होना। फिर नियंत्रक में विशेष रणनीति इंजेक्शन (एक गतिशील रेंडरर भी हो सकता है जो रनटाइम पर रणनीति चुनता है)।

कंटेनरवेयर एक बहुत ही खराब प्रथा है, यह कंटेनर में सेवाओं के सभी पर सवाल उठाता है। इस प्रकार, मैं दृढ़ता से इसे टालने की सिफारिश करता हूं।

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