Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony如何在扩展控制器的每个类中注入其DI容器?_Php_Symfony_Dependency Injection_Controller_Di Containers - Fatal编程技术网

Php Symfony如何在扩展控制器的每个类中注入其DI容器?

Php Symfony如何在扩展控制器的每个类中注入其DI容器?,php,symfony,dependency-injection,controller,di-containers,Php,Symfony,Dependency Injection,Controller,Di Containers,对于某些人来说,这可能看起来很愚蠢,但无论如何,我对Symfony的世界还不熟悉,阅读文档时,我产生了一个疑问: Symfony如何将DI容器实例注入到每个控制器类中,这些控制器类扩展控制器,使您可以使用get($id)方法轻松地从容器访问服务???就像这里: use Acme\HelloBundle\Newsletter\NewsletterManager; // ... public function sendNewsletterAction() { $mailer = $thi

对于某些人来说,这可能看起来很愚蠢,但无论如何,我对Symfony的世界还不熟悉,阅读文档时,我产生了一个疑问:

Symfony如何将DI容器实例注入到每个控制器类中,这些控制器类扩展控制器,使您可以使用get($id)方法轻松地从容器访问服务???就像这里:

use Acme\HelloBundle\Newsletter\NewsletterManager;

// ...

public function sendNewsletterAction()
{
    $mailer = $this->get('my_mailer');
    $newsletter = new NewsletterManager($mailer);
    // ...
}
我从GitHub看到了控制器类的源代码,Symfony中的控制器类扩展了抽象类ContainerWare,它实现了ContainerWareInterface接口,该接口有一个方法setContainer(ContainerInterface$container=null)

我可以假设控制器本身试图设置对调用从ContainerWare抽象类继承的setContainer的容器实例的引用,但我不确定我是否正确,但因为我知道在Symfony2中,每个服务(具有特定功能的对象)都在DI容器的监督下,谁负责将容器注入控制器setContainer()setter?容器本身?但是怎么做呢


谢谢你的关注

对于控制器,Symfony2使用ControllerResolver类确定控制器是否是ContainerWareInterface的实现,并将以这种方式注入容器。请参见此文件(突出显示的行):


至于其他服务,您必须通过服务定义手动将容器注入其中。

太好了,这就是我搜索的内容。谢谢如果将控制器声明为服务而不是注入容器,则标记的部分将其从容器中取出。它是注射的。