在yaml配置中定义服务时,如何在控制器中检索服务定义?

时间:2016-01-21 22:27:59

标签: symfony dependency-injection

我正在玩Symfony2 DependencyInjection。我在yaml中定义了服务,并希望在控制器中$container->getDefinition($serviceId)但是得到了InvalidArgumentException。当在 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
  

服务定义“broncos”不存在。

我觉得整个symfony.com/doc/components/dependency_injection部分适用于那些用PHP定义服务的人,而不是yaml。

编辑: 混淆的原因是章节:“使用容器服务定义”在Symfony DI文档中的“编译容器”章节之前。

3 个答案:

答案 0 :(得分:1)

是的,无论您使用yaml,php还是xml,都可以操纵您的服务。

在你的例子中,你创建了一个全新的ContainerBuilder,因此它是空的,显然你无法从这个新实例中检索服务。

从您的控制器中您将拥有容器,它已经编译好,您无法改变服务。

您只能在构建容器之前更改服务。它位于DependencyInjection文件夹内的Extension文件中或使用CompilerPass时。此时您将可以访问ContainerBuilder。

答案 1 :(得分:0)

要在控制器中获取服务,请致电

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

答案 2 :(得分:0)

在您的控制器中,您不需要实例化您自己的容器,但您需要使用应用程序容器。

所以试试这个:

    $container = $this->container;

而不是这个;

    $container = new ContainerBuilder() ;

希望这个帮助