Symfony如何在每个扩展了Controller的类中注入它的DI Container ?


How does Symfony injects its DI Container inside every class that extends the Controller one?

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

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

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

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

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

感谢您的关注!

对于控制器,Symfony2使用ControllerResolver类来确定控制器是否是ContainerAwareInterface的实现,并以这种方式注入容器。请看这个文件(高亮显示的行):

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

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