2014-05-22 29 views
9

को गतिशील चर पासिंग मैं उस तरह लग रहा है Symfony2 में एक सेवा है:एक सेवा निर्माता

services: 
    MyCustomService: 
     class:  MyClass 
     arguments: //Arguments aren't static, but dynamic based on application logic. 

क्या यह संभव है एक सेवा के निर्माता के लिए गतिशील चर पारित करने के लिए?

वहाँ के भीतर एक नियंत्रक के $this->get('MyCustomService');

वहाँ कुछ मैं याद कर रहा हूँ है किसी भी अतिरिक्त पैरामीटर होना प्रतीत नहीं होता है?

उत्तर

5

हैं, जो भी कारण के लिए, आप इन्स्टेन्शियशन के बाद सेवा को कॉन्फ़िगर करने में असमर्थ हैं, (यानी, with a configurator)। to a factory उस जिम्मेदारी को प्रस्तुत करने के बारे में क्या? यह आपको "गतिशील तर्क" के साथ सेवाओं को तुरंत चालू करने देगा।

services: 
    MyCustomServiceFactory: 
     class: MyClassFactory 
     arguments: [ @dynamicService, %time_prefix% ] 
    MyCustomService: 
     class:    MyClass 
     factory_service: MyCustomServiceFactory 
     factory_method:  get 

आपका कारखाने कुछ इस तरह करना चाहते हैं:

class MyClassFactory 
{ 
    private $dynamicService; 
    private $timePrefix; 

    public function __construct(MyDynamicService $dynamicService, $timePrefix) 
    { 
     $this->dynamicService = $dynamicService; 
     $this->timePrefix = $timePrefix; 

    } 

    public function get() 
    { 
     // Dynamic arguments based on application logic. 
     $dynamicArg1 = $this->dynamicService->getArg() 
     $dynamicArg2 = $this->timePrefix . time(); 

     return new MyClass($dynamicArg1, $dynamicArg2); 
    } 
} 
+0

हाँ, मुझे कक्षा को खुद को तत्काल करने की चिंता करने की इच्छा नहीं थी एक कारखाना अधिक समझ में आता है। हालांकि मैंने अपने कारखाने में मैन्युअल रूप से 'प्रारंभ ($ args) 'और' नया MyClass ($ args) 'का उपयोग किया था। धन्यवाद! – Tek

+0

आप इसे कैसे कहते हैं? –

+1

मैं भी उत्सुक हूं कि इसे कैसे कहा जाता है। आप% time_prefix% गतिशील रूप से कैसे गुजर रहे हैं? यह अभी भी एक पैरामीटर है जिसे yaml फ़ाइल afaik –

8

मेरे लिए, ऐसा लगता है, आपको समझ में नहीं आता कि "सेवा" शब्द का वास्तव में क्या अर्थ है। आप जो हासिल करने की कोशिश कर रहे हैं, अब सेवा नहीं होगी।

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

आप कुछ इस तरह का प्रयोग करेंगे:

$this->get('MyCustomService')->setSomething($something); 
+0

मैं दिनों के लिए तलाश कर दिया गया है और मैं कहीं भी नहीं मिल रहा है कि वास्तव में मुझे बताता है कि एक सेवा वास्तव में मायने रखती है। यह अविश्वसनीय रूप से निराशाजनक है। सभी दस्तावेज मुझे बताते हैं कि यह ऐसा कुछ है जो सेवा कंटेनर का उपयोग करता है, और फिर एक को कैसे लिखना है। मुझे यह नहीं पता कि वे किस चीज के लिए सबसे अच्छे हैं, सबकुछ 'हे सेवा हाँ' लगता है, वे यहाँ हैं कि कैसे एक बनाना है ' –

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