你如何在没有 PHP 框架的情况下以 MVC 模式编写你的控制器?

How do you write your controller in MVC pattern without PHP frameworks?

在没有 PHP 框架的情况下,您将如何以 MVC 模式编写控制器?

这是我的控制器最简单的版本,

//Controller
class Controller
{
    private $model;

    public function __construct($model){
        $this->model = $model;
    }

    public function clicked() {
        $this->model->string = "Updated Data, thanks to MVC and PHP!";
    }
}

如您所见,只有模型 作为其依赖项传递到我的控制器中。

这是我对MVC模式控制器的理解,可以参考以下文章,

https://r.je/views-are-not-templates.html

http://www.sitepoint.com/the-mvc-pattern-and-php-1/

PHP 框架开发人员可能不同意这一点,因为大多数框架似乎是 MVC,但可能是 Model 2.

In a Model 2 application, requests from the client browser are passed to the controller. The controller performs any logic necessary to obtain the correct content for display. It then places the content in the request (commonly in the form of a JavaBean or POJO) and decides which view it will pass the request to. The view then renders the content passed by the controller.

所以如果我们要将这些框架搁置一旁,那么您如何做控制器呢?

我在这个问题之前没有见过模型 2,但据我所知,它只是一个 Java 特定的 MVC 方法,它本身并不是一个单独的设计模式。

您还没有真正解释为什么您认为您提到的 PHP 框架不遵循 MVC,至少在 ZF 中,依赖项通过 via 传递是很常见的做法。一个控制器的构造函数,就像您在自己的框架中的示例中那样。

设计模式很容易掉进兔子洞,实际上很多都取决于解释。仅仅因为您对某个模式的实现与另一个模式不同,并不一定意味着另一个实现是错误的。

我写了一系列关于编写 MVC 应用程序的文章,灵感来自您发布的 links 之一。其中有一篇关于控制器的文章: Controllers are taking SRP seriously
先读一读。

So if we are going to put these frameworks aside, how do you do your controller then?

我的控制器没有对视图的引用。他们只更新您的代码示例中显示的模型,我认为这是正确的做法。控制器不应包含绑定到视图的逻辑。相反,视图从模型中获取数据(参见 The View gets its own data from the Model,其中我还解释了这种设计的优点)。
控制器可以根据需要使用任意多的依赖项(它们可能需要的不仅仅是注入的模型),但如果您密切遵循 SRP,控制器将不需要很多依赖项。

在大多数流行的框架中,您会看到一个控制器,其中包含一堆用于视图渲染的操作和绑定逻辑;我改为将所有这些操作分离到单独的控制器中,以便我在控制器和视图之间具有 1:1 关系。这使我可以拥有无​​需将逻辑绑定到视图的控制器(有关我如何做到这一点的详细说明,请参阅上面的 link)。我的控制器也以这种方式更紧密地遵循 SRP。

当我在上面说到控制器更新模型时,请注意 MVC Models are not just Domain Models。除了域模型,视图模型 存储视图呈现所需的状态,例如:允许更新实体的视图,比如用户,需要知道哪个用户需要更新(再次阅读文章以获得更详细的解释)。因此,在大多数情况下,我的控制器至少有两个依赖项,

  1. 允许我更新数据源的域模型(最常见的是 ORM 实例)
  2. 一个视图模型,允许我更新视图呈现所需的应用程序状态(例如要更新哪个用户、搜索过滤器等)