可以访问PHP MVC框架中的公共类

可以访问PHP MVC框架中的公共类,php,class,model-view-controller,dependency-injection,Php,Class,Model View Controller,Dependency Injection,我已经读了很多关于这方面的话题,但是仍然没有找到(或者已经能够找到)一个正确的答案 我正在开发一个小型MVC框架,我想要一些全局类/对象,我可以从我的控制器(但也可能是模型)调用它们 我可以走几条路: 全局变量 静态类/注册表 依赖注入 互联网似乎同意DI是最好的选择。我想我已经领会了这个想法,但还不舒服。所以我想加入一些背景信息;我可能是唯一一个在这个项目上工作的人,这是一个小项目,我所有的控制器都扩展了主控制器(所以我可以在那里加载一个类库) 作为一个具体的例子,我想要一个类别数组。因此,我

我已经读了很多关于这方面的话题,但是仍然没有找到(或者已经能够找到)一个正确的答案

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

我可以走几条路:

  • 全局变量
  • 静态类/注册表
  • 依赖注入
  • 互联网似乎同意DI是最好的选择。我想我已经领会了这个想法,但还不舒服。所以我想加入一些背景信息;我可能是唯一一个在这个项目上工作的人,这是一个小项目,我所有的控制器都扩展了主控制器(所以我可以在那里加载一个类库)

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

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

    我的2美分:

    在我不久前做的一个自制的小型框架中,我创建了一个名为Application的全局单例类,任何应该从任何地方都可以访问的东西都是这个类的属性或方法

    在我的例子中,有一个用于数据库访问的
    $db
    属性,一个用于访问用户数据和方法的
    $user
    属性,一个用于“通电的”
    $\u请求
    访问的
    $input
    属性,等等

    当然,您还有许多其他选择,适用于不同的场景。在那个场合,这种方法对我很有效

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


    最后,尽管我读到了一些关于它的批评和抱怨(也有赞扬),但我确实经常使用
    静态
    方法,主要用于比任何其他方法都更为“助手”的类。

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

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

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

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

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


    例如,我在一个DI容器上工作,该容器允许您使用注释()注入内容,但是DI还有其他几个库,所以你可以选择。

    除了处理请求和返回响应之外,你为什么还要做其他事情呢?可能是因为它不完美,我自己做的。听起来像是一个很难维护的
    全局
    fest。是的,我不应该这么叫它。我正在寻找一个像实体图书馆更多是的。难以维护。。。不太复杂。应用程序类非常少。“db”、“user”、“input”、“cache”和其他类在任何应用程序中都使用得很好,而且更健壮。@PeeHaa单个全局(一个单例)是如何实现的?@lafor“我确实经常使用静态方法”,但它就像一个黑盒。由于MVC,这些控制器神奇地被称为自动控制器。因此,我所有的控制器都将获得相同的DI容器。或者我应该在一个配置文件中指定哪个控制器得到什么?如果它们得到的都是相同的容器(您可以选择您想要的数据)。正如我所说,这是正确依赖注入的简化版本。使用DI,您将不会注入容器,而是注入依赖项(例如,您将向需要它的控制器注入类别数组)。因此,总之,您要么要执行“正确”的DI,然后必须指定哪个控制器通过配置文件(例如)获得什么,并开发使其工作的东西(或使用DI库)。或者要么你真的不在乎(你想让这些东西工作),然后你注入容器,你就完成了!这真的取决于项目是否认真,如果一个快速而肮脏的解决方案对你有效,不要过于复杂。