2015-12-10 8 views
6

मेरे पास FooService है जो किसी अन्य कॉन्फ़िगरेशन सेवा से कुछ डेटा प्राप्त करता है।सेवा के विधि परिणाम को किसी अन्य सेवा के लिए तर्क के रूप में कैसे इंजेक्ट करें?

मेरे पास कॉन्फ़िगरेशन सेवा है क्योंकि अनुरोध डेटा के आधार पर कॉन्फ़िगर अलग है। कॉन्फ़िगरेशन सेवा में RequestStack इंजेक्शन है और प्रासंगिक कॉन्फ़िगरेशन सरणी बनाता है।

class Foo 
{ 
    private $config; 

    /** 
    * @param Config $config 
    */ 
    public function __construct(Config $config) { 
     $this->config = $config->getData(); 
    } 
} 

फिर भी सेवा इंजेक्शन लगाने के बजाय, मैं getData का एकमात्र तरीका कॉल परिणाम इंजेक्षन करना पसंद करते हैं, के रूप में यह इकाई परीक्षण के लिए सरल है:

मेरे FooService इस प्रकार लग रहा है। मुझे कॉन्फ़िगर करने की आवश्यकता नहीं होगी, मैं सिर्फ एक सरणी पास कर सकता हूं।

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - [@config, getData] 

अभी तक यह भी पूरी सेवा injects:

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - @config 

मैं के माध्यम से कारखाने तरीकों के लिए की तरह मेरे foo परिभाषा को बदलने की कोशिश की:

मेरे वर्तमान service.yml एक परिभाषा की तरह है।

किसी अन्य सेवा के लिए तर्क के रूप में सेवा के विधि परिणाम को इंजेक्ट कैसे करें?

उत्तर

8

आप अभिव्यक्ति भाषा (New in Symfony 2.4)

डॉक here आप उदाहरण के रूप में कुछ कर सकते हैं में वर्णित है के साथ इस लक्ष्य को हासिल कर सकते हैं:

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
     arguments: ["@=service('config').getData()"] 

आशा इस मदद

+1

ब्रैकेट बहुत अधिक हैं, क्योंकि वे एक सरणी की सरणी इंजेक्ट करते हैं। बस '" @ = सेवा ('कॉन्फ़िगरेशन')। GetData() "पर्याप्त है। =) – k0pernikus

+0

इसे संस्करण [3] के बाद [http://symfony.com/doc/3.3/service_container/expression_language.html) स्थानांतरित कर दिया गया है ** ** – Trix

0

आप मूल रूप से एक निर्भरता इंजेक्शन कंटेनर मांग रहे हैं। आप अपना खुद का बना सकते हैं जिसमें एक साधारण कार्य (जैसे) get() है जो Foo का एक नया उदाहरण देता है? आप इसे get() के प्रत्येक आमंत्रण पर नई ऑब्जेक्ट बनाने के लिए परिभाषित कर सकते हैं, या एक सिंगलटन के अधिक जो हमेशा एक ही ऑब्जेक्ट लौटाते हैं (इसे एक निजी स्थिर चर में संग्रहीत करके)।

जैसे,

<?php 
class FooContainer implements YourContainerInterface { 
    public static function get() { 
     // Config logic here 
     return new Foo($config); 
    } 
} 
+0

ऐसा लगता है जैसे ओपी रेस को इंजेक्ट करने के लिए कह रहा है सेवा के बजाए एक सेवा के लिए एक विधि कॉल का लेफ्टिनेंट - हालांकि मुझे स्पष्ट रूप से समझ में नहीं आता कि वे ऐसा क्यों करना चाहते हैं, इसलिए मैं समस्या को गलत समझ सकता हूं। –

+0

@ जेरेमी हैरिस मैंने उपयोग के मामले को अद्यतन किया है क्योंकि मैं ऐसा क्यों करना चाहता हूं। – k0pernikus

+0

इस तरह से फ़ंक्शन को पास करने का एकमात्र तरीका स्ट्रिंग के माध्यम से होता है, जो वास्तव में आदर्श नहीं है क्योंकि आप उस पर किसी भी प्रकार की जांच नहीं कर सकते (अतिरिक्त तर्क का उपयोग किए बिना)। PHP में ऐसा करने का उचित तरीका कंटेनर ऑब्जेक्ट के माध्यम से है। – Ian

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