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

时间:2014-07-22 17:00:38

标签: php symfony dependency-injection controller di-containers

对于某些看似愚蠢的人来说,无论如何,我是Symfony世界的新手并且阅读了我怀疑的文档:

Symfony如何在每个Controller类中注入DI Container实例,它扩展Controller,以便您可以使用get($ id)方法轻松地从容器访问服务?像这里:

use Acme\HelloBundle\Newsletter\NewsletterManager;

// ...

public function sendNewsletterAction()
{
    $mailer = $this->get('my_mailer');
    $newsletter = new NewsletterManager($mailer);
    // ...
}

我从GitHub看到了Controller类的源代码,Symfony中的 Controller 类扩展了抽象类ContainerAware ,它实现了 ContainerAwareInterface 接口,它有一个方法 setContainer(ContainerInterface $ container = null);

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

感谢您的关注!

1 个答案:

答案 0 :(得分:3)

使用控制器,Symfony2使用ControllerResolver类来确定Controller是否是ContainerAwareInterface的实现,并将以这种方式注入容器。查看此文件(突出显示的行):

https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php#L79-L82

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