我只是关注http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1文章,并对DI容器有一些疑问。
假设我想在我的控制器内发生一个事件,我如何在我的控制器中找到调度员?
我正在通过
开始我的测试框架$c->get('app')->handle($request);
其中'app'是Symfony \ HttpKernel。如何设置容器的依赖项?假设我有一个在容器中定义的视图引擎
$c->register('view.engine', 'Core\ViewEngine');
我希望在Controller中提供该对象或解析该对象以呈现一些视图。这与事件发生同样的问题,我无法访问控制器内的那些值... DI容器应该如何在这样的情况下工作?
谢谢!
答案 0 :(得分:-1)
有不同的方法。您可能希望阅读下一步中的silex文档。在silex中,应用程序本身是一个DI容器。您还可以阅读Symfony 2文档的介绍。
最直接的方法(以及S2默认使用的方法)是将DI容器本身注入控制器。然后,控制器可以根据需要提取调度员等服务。
“更好”的方法是将调度程序以及控制器需要的任何其他内容直接注入控制器。它“更好”,因为控制器本身不需要访问容器。但这更加困难,因为控制器通常只需要一些服务就可以了。
============================================== < / p>
我如何在控制器中注入容器?
这就是看现有框架开始派上用场的地方。请记住,HTTPKernel是一个组件而不是框架。你如何使用它取决于你。
在Symfony 2中,app对象实际上是从内核而不是HTTPKernel派生的。内核又包含HTTPKernel的实例以及容器的实例。
您可以采取多种方法。没有一个“正确”的。
如果您查看HTTPKernel :: handleRaw,您会发现:
$controller = $this->resolver->getController($request))
您可以创建自己的控制器解析器对象,该对象将在创建控制器后注入容器。只有一种可能性。