PHP - 正确地在控制器中注入模型

Inf*_*ien -3 php model-view-controller dependencies dependency-injection inversion-of-control

我有一个简单的PHP MVC框架,它以这种方式工作:

   StaticFramework (1)
          |
          V
         DIC (2)
          |
          V
     HTTPRequest
          |
          V
         App <-> Router
          |
          V
      Controller <-> Model
          |
          V
         View
          |
          V
     HTTPResponse
Run Code Online (Sandbox Code Playgroud)

(1) StaticFramework是一个静态的"前端控制器",它给出了App它的默认依赖性(2) DIC(依赖注入容器),它的工作方式与Pimple类似.可以访问容器以更改这些默认依赖项.例如,Router类被注入AppDIC.

我有一个问题,因为它是一个MVC应用程序,我有3个重要的层:

  • 模型;
  • 视图;
  • 控制器.

注入View很容易,因为它只是一个有一个render呈现PHP或HTML文件的方法的类,所以我只需要View在我的注入一个实例Controller.

但注入ModelController似乎更难.每个Model都是一个单独的类,所以我不能像我那样注入它View.每个人Model也可能需要其他依赖,例如a DatabaseXML类.

此外,我无法预测Controller将需要哪些型号,因为它可能需要其中的几种,例如,ArticleController需要ArticleModelUsersModel.

我有几个解决方案:

  • ModelFactory在一个类中注入Controller将为其设置模型的类Controller.但是因为每个人Model可能需要不同的依赖关系,所以ModelFactory必须知道它需要哪一个,这似乎与PimpleDIC相似;
  • 不在其中注入模型Controller,并将每个模型作为单独的类,将其扩展到所需的范围.例如,如果需要MySQL连接,则Model应该扩展Database.但这意味着模型与其父级紧密相关,并且它使得无法Model使用模拟类或具有多个数据源,例如,如果Model需要两者Database并且XML

那么,Controller在我的框架中注入模型的最佳方法是什么?

提前感谢您的回答.

ter*_*ško 5

下面的神,这让我很伤心.

  • "静态框架"意味着代码的基础处于全局状态
  • 疙瘩不是DI容器
  • 你描述的不是一个"视图",而是一个愚蠢的模板
  • model是一个层,而不是要注入的类
  • 你应该学习使用命名空间而不是滥用后缀

</rant>

您的控制器应该与之交互Services.该模型包含持久性抽象,域实体,服务,存储库以及用于描述应用程序业务逻辑的内容.

无论如何,要使用必要的服务填充控制器,您应该使用适当的依赖注入器.我建议使用Auryn(基于反射)或Symfony DI(基于配置).