视图如何与模型通信?

时间:2013-10-07 12:13:59

标签: php model-view-controller

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

据我所知,控制器会将正确的信息指向模型。

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()'方法得到了模型的某些状态。状态是一些字符串视图知道该怎么做但它似乎不适合我。视图如何知道某人是否已登录?观点真的应该知道吗?

2 个答案:

答案 0 :(得分:2)

有趣的是,你看一下GoF's book中MVC模式的简要描述,或者看看关于SmallTalk中模式的original article,你会看到控制器控制用户与观点的互动。

View通常直接订阅模型更改。您可以为同一模型提供多个视图,每个视图都反映模型更改,而无需任何控制器。

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

在GUI中,视图通常使用Observer模式的一些实现来订阅模型。在PHP中它没有多大意义,因为一切都是通过请求呈现的(请求之间通常没有共享状态),因此,视图只能查询模型上的方法。

答案 1 :(得分:1)

如果你想探索MVC和MVC风格的模式,你应该首先阅读 Martin Fowler GUI Architecture。把它当作你的必修文献。


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

还有其他方法。

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

这意味着,不是在观察者上转发,而是已经知道模型层的哪些部分可以被更改并请求信息。

另一种方法称为 MVP 。要探索这一点,如果你阅读模式的定义publication,你会更好。