3

我已经阅读了很多关于此的 SO 主题,但仍然没有找到(或能够创建)正确的答案。

我正在开发一个小型 MVC 框架,我想要一些可以从控制器调用的全局类/对象(但也可能是模型)。

我可以采取几条路线:

  1. 全局变量
  2. 静态类/注册表
  3. 依赖注入

互联网似乎同意 DI 是最佳途径。我想我已经掌握了这个想法,但还不舒服。所以我想提供一些背景信息;我可能是唯一一个在这个项目上工作的人,这是一个小项目,我所有的控制器都扩展了主控制器(所以我可以在那里加载一个类库)。

作为一个具体的例子,我想要一个类别数组。所以我开始将该数组放在 CategoryController 中。但现在我注意到我有点想在我的前视图和 ProductController 中使用该数组。显然我不想将所有 CategoryController 加载到 ProductController 中。您也可以说我可以将该数组放在某种配置或设置文件中,因为这个示例很简单,但这就是为什么它是一个示例。我可能会用更多的功能扩展它。

所以总结一下:在 PHP 中(特别是在 MVC 模型中)你如何让你的类(主要是控制器)访问某种通用类或其他可共享的功能。

4

2 回答 2

2

您的控制器是由“某物”(通常是前端控制器)创建的。因此,当创建控制器时,您可以注入一个依赖注入容器。

在您的配置/引导程序中(在创建控制器之前),您应该将类​​别添加到容器中。

这样您就可以从每个控制器访问类别。

请注意,这是一个简单的示例,并不完全符合依赖注入的精神。最好的解决方案是直接注入类别(而不是注入容器)。但是,如果您推广该模式(在您的前端控制器中处理大量依赖项),这可能会成为很多工作。

一个解决方案是使用可以为您做到这一点的依赖注入框架。

例如,我在一个 DI 容器上工作,它可以让你注入带有注释的东西(PHP-DI),但是还有其他几个用于 DI 的库,所以你可以选择。

于 2013-03-24T20:47:13.773 回答
-1

我的 2 美分:

在我前段时间做的一个小型自制迷你框架中,我创建了一个名为 Application 的全局单例类,应该从任何地方/任何地方访问的任何/一切都是该类的属性或方法。

在我的例子中,有一个$db用于数据库访问的$user属性,一个用于访问用户数据和方法的$input属性,一个用于“动力”$_REQUEST访问的属性,等等。

当然,你还有很多其他的选择,适合不同的场景。在那种情况下,这种方法对我来说效果很好。

现在,如果你想从另一个控制器访问一个控制器,这听起来很奇怪。您要访问的这个“东西”应该是模型类、库类或其他任何东西,但它不应该被“锁定”在控制器类中。实际上,控制器应该“尽可能薄”,并专注于根据用户输入(请求)从其他类调用适当的方法,然后调用一些输出方法来生成并发送答案(响应)。

最后,虽然我读过一些关于它的批评和抱怨(以及赞美),但我确实经常使用static方法,主要是针对那些比其他任何东西都更“帮助”的类。

于 2013-03-23T23:50:12.893 回答