2012-09-01 14 views
20

मुझे सक्षम config भाषाओं जैसे my config.yml से कुछ कॉन्फ़िगरेशन पैरामीटर पार्स करने की आवश्यकता है। लेकिन जब मैं सामान्य सिम्फनी विधि का उपयोग करके ऐसा करने का प्रयास करता हूं: $this->container->get('my_params'); यह विफल रहता है क्योंकि मेरा व्यवस्थापक वर्ग Sonata\AdminBundle\Admin\Admin वर्ग बढ़ाता है जो Symfony\Component\DependencyInjection\ContainerAware कक्षा का विस्तार नहीं करता है।सोनाटा एडमिन क्लास में कंटेनर इंस्टेंस कैसे प्राप्त करें?

कृपया, सोनाटा एडमिन क्लास के अंदर कंटेनर कैसे प्राप्त करें?

अब मैं कंटेनरवेयर को विस्तारित करने के लिए सोनाटा एडमिन क्लास को ओवरराइड करके इस समस्या का समाधान कर रहा हूं।

उत्तर

45

शायद पहले से ही हल हो गई है, क्योंकि इसके एक पुराने सवाल, लेकिन सिर्फ संदर्भ के लिए, कंटेनर पहले से ही एक है विन्यास पूल का उपयोग कर व्यवस्थापक कक्षा में vailable ...

$this->getConfigurationPool()->getContainer(); 
बेशक

, यह व्यवस्थापक कक्षा में सेवाएं इंजेक्षन करने के लिए बेहतर अभ्यास है, लेकिन, नियंत्रकों में की तरह। अगर कोई कंटेनर उपलब्ध हो तो सेटर इंजेक्शन को कॉन्फ़िगर करने के लिए कोई समय क्यों लेगा?

1

आपकी विशेष स्थिति में, कस्टम AdminController कक्षा आपके Admin कक्षा के पैरामीटर सेट करने के लिए बुद्धिमान हो सकती है। यह एमवीसी पैटर्न का पालन करेगा और आपको विक्रेता बंडलों को बदलने से बचाएगा। यदि आपको नहीं पता कि यह कैसे करें, तो कृपया अपना प्रश्न अपडेट करें और मैं अधिक विस्तार से समझाऊंगा।

बस जरूरत सेवा सेटर इंजेक्शन का उपयोग कर इंजेक्षन:

+0

मैंने कंटेनर को अपने व्यवस्थापक वर्ग में इंजेक्शन करके हल किया जो एक खराब पैराक्टिस है। मैंने इंजेक्शन के निर्माण के बजाय सेटर इंजेक्शन का उपयोग किया क्योंकि निर्माण में माता-पिता का बिल्कुल प्रोटोटाइप होना चाहिए। – skonsoft

2

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

समाधान है:

<!-- file: services.xml --> 

<service id="skonsoft.znata.admin.keyword" class="%skonsoft.znata.admin.keyword.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="Keyword" label="Keyword"/> 
      <argument /> 
      <argument>%skonsoft.znata.admin.keyword.entity.class%</argument> 
      <argument>SonataAdminBundle:CRUD</argument> 
      <call method="setTranslationDomain"> 
       <argument>SkonsoftZnataBundle</argument> 
      </call> 

      <!-- here you inject needed services or parameters --> 
      <call method="setEnabledLocales"> 
       <argument>%skonsoft_znata.locales%</argument> 
      </call> 
     </service> 

तब, केवल अपने व्यवस्थापक setEnabledLocales बुलाया कक्षा में एक सार्वजनिक विधि जोड़ें।

/* file: MyclassAdmin.php */ 

public function setEnabledLocales($locales){ 
    $this->enabedLocales = $locales; 
} 

पर एक नज़र डालें:

Service Container documentation

+0

आप कन्स्ट्रक्टर इंजेक्शन का उपयोग कर सकते हैं, बस सुनिश्चित करें कि आपके एडमिन क्लास कन्स्ट्रक्टर को '$ कोड', '$ class' और' $ baseControllerName' पहले 3 पैराम के रूप में लिया गया है, और फिर आपकी कस्टम निर्भरताएं। कॉल करें 'पैरेंट :: __ निर्माण ($ कोड, $ वर्ग, $ बेसकंट्रोलरनाम) '। अंत में, अपनी सेवाओं के भीतर पहले से कॉन्फ़िगर किए गए 'तर्क' अनुभाग के नीचे अपनी कस्टम निर्भरताओं की घोषणा करें। [Yml | xml | जो कुछ भी]। – orgasmix

14

सेवाओं विन्यास में अपने व्यवस्थापक वर्ग

/** @var \Symfony\Component\DependencyInjection\ContainerInterface */ 
private $container; 

public function setContainer (\Symfony\Component\DependencyInjection\ContainerInterface $container) { 
    $this->container = $container; 
} 

में जोड़े और जोड़ने के कॉल (विन्यास YAML एक्सएमएल या PHP में निर्दिष्ट किया जा सकता):

वाईएएमएल

calls: 
    - [ setContainer, [ @service_container ] ] 

एक्सएमएल

<call method="setContainer"> 
    <argument type="service" id="service_container" /> 
</call> 

अब आप सामान्य सिम्फोनी विधि का उपयोग कर सकते हैं: $this->container->get()

अधिक जानकारी के लिए देख Service Container प्रलेखन

+0

यह कस्टम सीआरयूडी नियंत्रक में काम नहीं कर सकता है क्योंकि सोनाटा व्यवस्थापक खुद को आवंटित करना चाहता है। –

+0

सामान्य मामले में, इस विधि को किसी भी सेवा के साथ काम करना चाहिए। देखें [निर्भरता इंजेक्शन] (http://symfony.com/doc/master/components/dependency_injection/index.html) –

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