2016-01-21 22 views
-1

我在玩Symfony2 DependencyInjection。我在yaml中定義了服務,並想在控制器中使用$container->getDefinition($serviceId),但得到了InvalidArgumentException。在yaml配置中定義服務時是否可以檢索控制器中的服務定義?如何在yaml config中定義服務時檢索控制器中的服務定義?

//services.yml 
services: 
     patriots: 
      class: CwBundle\Utils\PatriotsClass 
      calls: 
       - [setBrady, ['%brady%']] 

     broncos: 
      class: CwBundle\Utils\BroncosClass 
      arguments: [@patriots] 



//controller 
     $container = new ContainerBuilder() ; 
     $a = $container->hasDefinition('patriots'); 
     $b = $container->findDefinition('broncos'); 
     $c = $container->getMethodCalls('patriots'); 
     //print_r $a,$b,$c 

服務定義 「野馬」 不存在。

我有一種感覺,這整個symfony.com/doc/components/dependency_injection部分是爲那些在PHP定義服務,而不是yaml。


編輯: 混亂的原因是,第一章:「與集裝箱服務定義工作」正章之前的Symfony DI文檔「編譯容器」。

+2

在您的鏈接中:「此處更改服務定義的方法只能在容器編譯之前使用。」Symfony 2編譯您的容器並將其存儲在結果中。您將無法對控制器的定義進行任何操作。看看編譯器通行證:http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html,看看它們是否符合你的要求。但是您將無法基於路線混淆現有的服務定義。 – Cerad

+0

@Cerad謝謝你的回答。我沒有要求,我只是閱讀這個dep-injection - 文檔和「玩」與方法顯示在那裏與yaml配置中定義我的服務。 (但這個「玩」意味着拋出異常)。所以如果服務在yaml中定義,你不能再操縱它了嗎? – Sruj

+0

文檔鏈接通常用於Symfony2的依賴注入,包括所有可用的格式(yml,php,xml) – chalasr

回答

1

是的,你可以操縱你的服務,無論您使用YAML,PHP或XML。

在你的例子中,你創建一個新的新的ContainerBuilder,所以它是空的,顯然你不能從這個新實例中檢索服務。

從你的控制器中你將擁有容器,它已經被編譯,你不能改變服務。

您只能在構建容器之前更改服務。它位於DependencyInjection文件夾內的擴展文件中或使用CompilerPass時。此時您將有權訪問ContainerBuilder。

+0

造成這種混淆的原因是章節「使用容器服務定義」在「編譯容器」一章之前。 – Sruj

0

要獲得控制服務調用

$this->container->get('name_of_service') 
+0

「檢索服務定義」我不是指服務,而是像這裏的服務定義http://symfony.com /doc/2.8/components/dependency_injection/definitions。html#getting-and-setting-service-definitions(沒有解釋'$ container'是什麼) – Sruj

0

在你的控制器,你不需要實例化自己的飯盒,但你需要使用的應用程序容器。

那麼試試這個:

$container = $this->container; 

代替本;

$container = new ContainerBuilder() ; 

希望這有助於

+0

謝謝你的回答。使用$ this->容器,我無法訪問我在主要文章中指出的ContainerBuilder對象中的方法。但我想這是有原因的。 @metfan後已經清除了我的想法。 – Sruj

相關問題