我昨天读了这篇文章:https://igor.io/2012/11/09/scaling-silex.html
还有一个http://davedevelopment.co.uk/2012/10/03/Silex-Controllers-As-Services.html
因此我的脑海中出现了一个概念性问题:
目前我确实在不同的类中有很多 Controller 。我覆盖 controller_resolver
以创建 Controller 类实例并将 $app
注入(inject)到 Controller 的构造函数中。
我定义这样的路由 $app->get('/hello', 'HelloController::indexAction')
<- 我的 Controller 解析器将创建 new HelloController($app);
- 到目前为止一切顺利。
但说实话,它变成了 ServiceLocator 模式,而不是 DependencyInjection,因为我确实注入(inject)了整个 $app
,这看起来像 ServiceLocator 的用法。
现在我有疑问:我应该保持原样(因为它运行良好)还是尝试“ Controller 即服务”来仅注入(inject) Controller 真正依赖的那些服务?也许我的 SeviceLocator 方法有一天会打击我? (人们说 DI 更适合测试)。
我还研究了 Symfony Framework Bundle:类 Controller
扩展了抽象类 ContainerAware
,它还注入(inject)了整个 $container
!全栈框架中的ServiceLocator方法?
有什么推荐吗?优点/缺点?
最佳答案
symfony2全栈框架
该框架使用依赖注入(inject)模式而不是服务定位器模式。
默认情况下,所有 Controller 都不是服务。 ContainerAware
类包含访问服务容器的方法,因此您可以在 Controller 内调用服务。
如果您要使用 Controller 即服务,则需要删除 Controller
扩展。您想要在 Controller 内使用的所有依赖项都需要由服务容器注入(inject)。
在 a blogpost by richard miller 中了解更多相关信息,Symfony2 核心贡献者之一。
Silex 微框架
Silex 微框架提供了框架的基本框架,架构的外观以及使用的模式取决于您。
Silex 文档使用的 Controller 不是服务。它将完整的服务容器注入(inject)到 Controller 中:
$app->post('/post/{id}-{slug}', function($id, $slug) use ($app) {
// ...
});
如果您想将 Controller 用作服务,您应该只在 Controller 内注入(inject)您想要使用的服务。
编辑:Controller::action
语法也指不是服务的 Controller 。 Controller:action
表示法用于将 Controller 称为服务。
关于symfony - Silex - 真正的 DI 与注入(inject) $app(看起来像 ServiceLocator)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13320502/