0

我刚刚关注了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 容器应该如何在这种情况下工作?

谢谢!

4

1 回答 1

-1

有不同的方法。作为下一步,您可能需要通读 silex 文档。在 silex 中,应用程序本身就是一个 DI 容器。你也可以阅读 Symfony 2 文档的介绍。

最直接的方法(也是 S2 默认使用的方法)是将 DI 容器本身注入到您的控制器中。然后控制器可以根据需要拉出调度程序等服务。

“更好”的方法是将调度程序与控制器需要的任何其他内容一起直接注入控制器。它“更好”,因为控制器本身不需要访问容器。但这更加困难,因为控制器通常需要许多服务来完成它的工作。

===============================================

我将如何将容器注入控制器中?

这就是查看现有框架开始派上用场的地方。请记住,HTTPKernel 是一个组件,而不是一个框架。你如何使用它取决于你。

在 Symfony 2 中,app 对象实际上是从内核而不是 HTTPKernel 派生的。内核又包含一个 HTTPKernel 的实例以及一个容器的实例。

您可以采取几种方法。没有一个“正确”的。

如果你查看 HTTPKernel::handleRaw 你会发现:

$controller = $this->resolver->getController($request))

您可以创建自己的控制器解析器对象,该对象将在创建控制器后注入容器。只有一种可能。

于 2013-07-11T16:45:11.213 回答