2015-12-10 12 views
6

我有一個FooService從另一個配置服務獲取一些數據。如何將服務的方法結果作爲另一個服務的參數注入?

我有配置服務,因爲配置根據請求數據的不同而不同。配置服務已注入RequestStack並構建相關的配置數組。

FooService如下所示:

class Foo 
{ 
    private $config; 

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

然而代替注射服務的,我更願意僅注入的getData方法調用的結果,因爲它是單元測試更簡單。我不需要模擬配置,我只需傳遞一個數組。

我現在service.yml具有類似的定義:

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

然而,這也注入了整個服務:

config: 
    ... 

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

我試圖通過改變我的定義foo像工廠方法。

如何將服務的方法結果作爲另一個服務的參數進行注入?

回答

8

您可以用表達式語言(New in Symfony 2.4

如DOC here你可以做一些事情作爲例子說明實現這一目標:

config: 
    ... 

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

希望這幫助

+1

這裏的括號太多了,因爲它們注入了一個數組的數組。只需要'「@ = service('config')。getData()」'就足夠了。 =) – k0pernikus

+0

從版本** 3開始,它已經被移到[here](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

聽起來像OP是問如何注入結果這是一種調用服務而不是服務本身的方法 - 儘管我不清楚爲什麼他們會這麼做,所以我可能會誤解這個問題。 –

+0

@JeremyHarris我已經更新了爲什麼我想要這樣做的用例。 – k0pernikus

+0

以這種方式傳遞函數的唯一方法是通過字符串,這實際上並不理想,因爲您無法對其進行任何類型檢查(不使用其他邏輯)。在PHP中執行此操作的適當方法是通過容器對象。 – Ian

相關問題