Silex - 真正的DI vs注入$ app,看起来像ServiceLocator?

Pet*_*etr 5 dependency-injection service-locator symfony silex

我昨天读了这篇文章:https://igor.io/2012/11/09/scaling-silex.html

另一个http://davedevelopment.co.uk/2012/10/03/Silex-Controllers-As-Services.html

所以一个概念性的问题在我脑海中浮现:

目前我在不同的课程中有很多控制器.我覆盖controller_resolver创建一个控制器类实例并注入$appcontoller的构造函数.

我定义这样的路线$app->get('/hello', 'HelloController::indexAction')< - 我的控制器解析器将创建new HelloController($app);- 到目前为止一切都很好.但说实话,它变成了ServiceLocator模式,而不是DependencyInjection,因为我注入了整个$app看起来像ServiceLocator用法的东西.

现在我有疑问:我应该保持原样(因为它运行良好)或尝试"控制器作为服务"只注入我的控制器真正依赖的那些服务?可能是我的SeviceLocator方法有一天会打我?(人们说DI更适合测试).

我也研究了Symfony Framework Bundle:class Controller扩展了抽象类ContainerAware,它也$container注入了整个!完全堆栈框架中的ServiceLocator方法?

任何推荐?优点缺点?

Wou*_*r J 4

symfony2全栈框架

该框架使用依赖注入模式而不是服务定位器模式。

默认情况下,所有控制器都不是服务。该类ContainerAware包含访问服务容器的方法,因此您可以在控制器内调用服务。

如果您打算使用控制器即服务,则需要删除扩展Controller。您想要在控制器内使用的所有依赖项都需要由服务容器注入。

请阅读Symfony2 核心贡献者之一richard miller 的博文了解更多相关内容。

Silex 微框架

Silex 微框架提供了框架的基本框架,架构的外观以及使用的模式取决于您。

Silex 文档使用的控制器不是服务。它将完整的服务容器注入到控制器中:

$app->post('/post/{id}-{slug}', function($id, $slug) use ($app) {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

如果您想将控制器用作服务,您应该只在控制器内注入您想要使用的服务。

编辑:Controller::action语法也指不是服务的控制器。该Controller:action符号用于将控制器称为服务。