symfony - Silex - 真正的 DI 与注入(inject) $app(看起来像 ServiceLocator)?

标签 symfony dependency-injection silex service-locator

我昨天读了这篇文章: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/

相关文章:

php - SILEX PHP FORM - DateTime 类的对象无法转换为字符串

php - 链接一个实体以具有多个图像和视频

performance - Symfony2 - 共享主机上的引导速度非常慢

php - symfony循环中的日期减10分钟

c# - Autofac - 注册多个装饰器

php - Silex/Symfony 以编程方式登录

symfony - Symfony2 测试中的数据库清理

java - 带有命令模式的 spring beans 映射

java - 如何将属性注入(inject)到 WebSocketHandler 中?

php - openssl 加密/解密工作不一致/失败