我正在玩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文档中的“编译容器”章节之前。
答案 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() ;
希望这个帮助