5

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

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

于是一个概念性的问题出现在我的脑海中:

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

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

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

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

有什么推荐吗?优点缺点?

4

2 回答 2

4

symfony2 全栈框架

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

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

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

在Symfony2 的核心贡献者之一Richard Miller 的博文中阅读更多相关信息。

Silex 微框架

Silex 微框架提供了框架的基本框架,由您决定架构的外观和使用的模式。

Silex 文档使用不是服务的控制器。它在非常控制器内注入完整的服务容器:

$app->post('/post/{id}-{slug}', function($id, $slug) use ($app) {
    // ...
});

如果你想使用控制器作为服务,你应该只在控制器中注入你想要使用的服务。

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

于 2012-11-10T10:50:17.483 回答
1

这里涉及很多个人喜好。您已经完成的是组织代码库的一个很好(足够)的步骤。像我这样的人更进一步,将我们的控制器移动到容器中,而不是将其注入到某种 BaseController 中。这发生在 Silex 和全栈 Symfony 框架中。

我的建议是保留所有内容,然后尝试通过练习 BDD 将下一个控制器定义为服务。

例如,一个 UserController 视图操作的行为:

  • 它应该从数据库中检索用户
  • 它应该使用模板呈现用户

它没有一次提到从容器中检索数据库或模板渲染器。我很乐意不注入容器,所以我只会注入 BDD 引导我相信我需要的东西。

于 2012-11-15T14:41:16.903 回答