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

时间:2015-03-26 10:48:03

标签: php symfony zend-framework model-view-controller

如果没有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的形式)并决定   哪个视图会将请求传递给。视图然后渲染   控制器传递的内容。

因此,如果我们打算将这些框架放在一边,那么你如何做你的控制器呢?

2 个答案:

答案 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. 允许我更新数据源的域模型(最常见的是ORM实例)
  2. 一个视图模型,允许我更新视图渲染所需的应用程序状态(比如要更新的用户,搜索过滤器......)

答案 1 :(得分:1)

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

你还没有真正解释为什么你认为你提到的PHP框架没有遵循MVC,在ZF中至少通过实例来传递依赖关系是很常见的。您自己的框架中的示例中的控制器构造函数。

通过设计模式很容易陷入兔子洞,真的很多都是解释。仅仅因为你的模式实现与另一个模式的实现不一样,并不一定意味着其他实现是错误的。