如果没有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。
在Model 2应用程序中,传递来自客户端浏览器的请求 到控制器。控制器执行必要的逻辑 获取正确的显示内容。然后将内容放入 请求(通常以JavaBean或POJO的形式)并决定 哪个视图会将请求传递给。视图然后渲染 控制器传递的内容。
因此,如果我们打算将这些框架放在一边,那么你如何做你的控制器呢?
答案 0 :(得分:2)
我已经编写了一系列关于编写MVC应用程序的文章,其灵感来自您发布的一个链接。其中有一篇关于控制器的文章:
Controllers are taking SRP seriously
首先阅读。
因此,如果我们打算将这些框架放在一边,你如何做到这一点 那么控制器呢?
我的控制器没有对视图的引用。他们只更新代码示例中显示的模型,我认为这是正确的方法。控制器不应包含视图的绑定逻辑。相反,视图从模型中获取数据(参见The View gets its own data from the Model,我也解释了这种设计的优点)。
控制器可以根据需要使用尽可能多的依赖项(它们可能需要的不仅仅是注入的模型),但如果您密切关注SRP,控制器将不再需要很多依赖项。
在大多数流行的框架中,您会看到一个控制器,其中包含一系列用于视图呈现的操作和绑定逻辑;我将所有这些操作分离到单独的控制器中,以便在控制器和视图之间建立1:1的关系。这允许我让控制器没有绑定视图的逻辑(请参阅上面的链接,了解我如何做到这一点的详细说明)。我的控制器也以这种方式更密切地关注SRP。
当我在上面说过,控制器更新模型时,请注意MVC Models are not just Domain Models。除了域模型之外,视图模型还存储视图渲染所需的状态,例如:允许更新实体的视图,例如让用户说,需要知道哪些用户需要待更新(再次阅读文章以获得更详细的解释)。因此,我的控制器在大多数情况下至少有两个依赖项,
答案 1 :(得分:1)
在这个问题之前我没见过模型2,但据我所知,它只是一种特定于Java的MVC方法,它不是一个单独的设计模式。
你还没有真正解释为什么你认为你提到的PHP框架没有遵循MVC,在ZF中至少通过实例来传递依赖关系是很常见的。您自己的框架中的示例中的控制器构造函数。
通过设计模式很容易陷入兔子洞,真的很多都是解释。仅仅因为你的模式实现与另一个模式的实现不一样,并不一定意味着其他实现是错误的。