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
创建一个控制器类实例并注入$app
contoller的构造函数.
我定义这样的路线$app->get('/hello', 'HelloController::indexAction')
< - 我的控制器解析器将创建new HelloController($app);
- 到目前为止一切都很好.但说实话,它变成了ServiceLocator模式,而不是DependencyInjection,因为我注入了整个$app
看起来像ServiceLocator用法的东西.
现在我有疑问:我应该保持原样(因为它运行良好)或尝试"控制器作为服务"只注入我的控制器真正依赖的那些服务?可能是我的SeviceLocator方法有一天会打我?(人们说DI更适合测试).
我也研究了Symfony Framework Bundle:class Controller
扩展了抽象类ContainerAware
,它也$container
注入了整个!完全堆栈框架中的ServiceLocator方法?
任何推荐?优点缺点?
该框架使用依赖注入模式而不是服务定位器模式。
默认情况下,所有控制器都不是服务。该类ContainerAware
包含访问服务容器的方法,因此您可以在控制器内调用服务。
如果您打算使用控制器即服务,则需要删除扩展Controller
。您想要在控制器内使用的所有依赖项都需要由服务容器注入。
请阅读Symfony2 核心贡献者之一richard miller 的博文了解更多相关内容。
Silex 微框架提供了框架的基本框架,架构的外观以及使用的模式取决于您。
Silex 文档使用的控制器不是服务。它将完整的服务容器注入到控制器中:
$app->post('/post/{id}-{slug}', function($id, $slug) use ($app) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
如果您想将控制器用作服务,您应该只在控制器内注入您想要使用的服务。
编辑:Controller::action
语法也指不是服务的控制器。该Controller:action
符号用于将控制器称为服务。
归档时间: |
|
查看次数: |
1778 次 |
最近记录: |