2014-05-22 56 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

是的,我不喜歡不必擔心實例本身上課的時候工廠更有意義。然而,我剛剛手動初始化了工廠,在我的情況下使用了'get($ args)'和'return new MyClass($ args)'。謝謝! – Tek

+0

你怎麼稱呼它? –

+1

我也很好奇這是如何被稱爲。你如何動態地傳遞%time_prefix%?這仍然是需要在YAML文件中定義AFAIK –

8

對我來說,這聽起來像,你不明白一個字「服務」的真正含義。你試圖達到的目標不再是服務。

您仍然可以定義一個setter方法你的「MyClass的」任何自定義的參數內,同時定義一些默認的,當您使用setter方法,你基本上覆蓋。

你會使用這樣的:

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

我一直在尋找了幾天,我找不到任何地方真的告訴我什麼是服務的真正意義。這令人難以置信的令人沮喪。所有文檔都告訴我,它是使用服務容器的東西,然後是如何編寫一個。不,我在哪裏可以找到他們最適合什麼樣的解釋,似乎一切都「嗨服務啊,他們冷靜這裏是如何做一個」 –