1

我想知道视图如何与模型通信。

据我了解,控制器将正确的信息引导至模型。

class Controller
{
    public function action()
    {
        if(isset($_POST) )
        {
            $this->model->someMethod($_POST['foo'],$_POST['bar']);
        }
    }
}

该模型做它的生意。

class Model
{
    public function someMethod($foo,$bar)
    {
        // do something
    }
}

视图必须以某种方式知道如何与模型通信以获取其当前状态。但是这是怎么做到的呢?

class View
{
    public function action()
    {
        // ask the model what is going on
    }
}

视图如何知道发生了什么以及一切是否正确。我想通过模型上的“getState()”方法来获取模型的某些状态。状态是一些字符串,视图知道如何处理但对我来说似乎不是正确的方法。例如,视图如何知道是否有人登录?视图真的应该知道这一点吗?

4

2 回答 2

2

有趣的是,如果您查看GoF 的书中对 MVC 模式的简要描述,或者查看 SmallTalk 中有关该模式的原始文章,您会看到控制器控制用户与视图的交互。

View 通常直接订阅模型的变化。您可以对同一模型有多个视图,并且每个视图都反映了模型更改而无需任何控制器。

控制器是附加到特定视图以处理用户未输入并将其转换为更高级别的抽象的东西(即打算更新模型中的某些内容,或将消息传递给子视图或其他内容)。

在 GUI 中,视图通常使用观察者模式的某些实现订阅模型。在 PHP 中它没有多大意义,因为一切都是由请求渲染的(请求之间通常没有共享状态),因此,视图可以只查询模型上的方法。

于 2013-10-07T12:36:05.663 回答
1

如果您想探索 MVC 和受 MVC 启发的模式,您应该从阅读Martin FowlerGUI Architecture开始。将其视为您的强制性文献。


在经典的 MVC 模式中,视图观察模型层的状态变化。这种方法在 PHP 中并不可行。您仍然可以尝试应用它,但额外的复杂性会使好处相形见绌。

还有其他方法。

Model2 MVC(或俗称“Web MVC”)摆脱了观察者。由于在 Web 应用程序中您有简单的请求-响应工作流,并且控制器和视图自然形成对,因此您可以利用它。当您知道将使用哪个控制器来更改模型状态时,您还可以同时获得有关哪个视图将用于响应的信息。

这意味着,视图不是中继观察者,而是已经知道模型层的哪些部分可以更改并请求信息。

另一种方法称为MVP。要探索这一点,最好阅读该模式的定义出版物

于 2013-10-07T12:47:45.017 回答