9

我有一个简单的登录表单的以下数据流。

用户访问控制器 PHP 文件。控制器包括model.php和view.php

用户提交表单,控制器将 POST 数据发送到模型方法,并返回结果。

用户已登录,并由控制器转发到不同的视图(登录成功消息)。

目前我的观点是静态 HTML(没有 PHP),所以这是我的问题。然后向用户传递欢迎消息的正确方法是什么,例如“你好,克雷格!”?

视图是否允许 PHP 片段,例如

<?php echo $username; ?> 

因为模型是在控制器文件之前加载的?

谢谢!

编辑:然后允许视图访问特定的类方法是不是更好的做法,例如

<?php $user->getUsername(); ?>

而不仅仅是变量?


根据其他答案,我找到了一篇非常有用的文章,您可能也对此感兴趣。

http://www.nathandavison.com/posts/view/7/custom-php-mvc-tutorial-part-5-views

4

2 回答 2

19

以下是您必须考虑的几件事:

  • 你不能在 PHP 中做经典的 MVC。相反,我们有受 MVC 启发的模式
  • 为 Web 实现时,视图和控制器实例之间存在 1:1 的关系
  • MVC 中的模型不是一个类。它是一个层,包含许多不同的类
  • View 不是一个愚蠢的模板,而是一个类的实例,它处理表示逻辑

在基于 Web 的 MVC 中查看

如上所述, MVC 和受 MVC 启发的模式中的视图负责表示逻辑。这包括显示错误消息和分页等内容。为此,每个视图可以处理多个模板。

View 从模型层接收信息,并采取相应的行动。来自模型层的信息如何最终出现在视图中的方式是 MVC 模式中最显着的差异之一:

  • 经典的 MVC模式

    当模型状态改变时,模型层的结构将信息发送到视图。这是通过观察者模式完成的。

  • Model2 MVCHMVC模式

    View 可以直接访问模型层,并能够从中请求信息。这是最接近原始模式的。

  • MVVMMVP模式

    View 通过控制器接收信息,控制器又从模型层请求它。模式的进一步差异源于在将数据传递给视图之前对数据的处理方式。

您现在似乎拥有的实际上只是一个模板。与本文中描述的一个类似。你最终得到一个结构,它没有地方包含表示逻辑。从长远来看,这将导致表示逻辑被推入控制器。

那么那个“欢迎”信息呢?

为了显示欢迎信息,您的视图应该从模型层请求当前用户的名称。如果模型层返回某种错误状态,查看选择错误消息模板并插入到布局中。

如果从模型层检索到用户名没有问题,请查看选择包含问候语的模板,在模板中设置值并呈现它。

应按什么顺序装载零件?

控制器应该初始化模型和视图的想法来自对 Web 的 MVC 的非常原始的解释。模式称为页面控制器,它试图将 MVC 直接嫁接到静态网页上。

在我看来,这应该是顺序:

  1. 模型

    您初始化结构,通过它您将处理模型层。它很可能是某种服务工厂,它可以让您构建诸如Authentication登录Library服务和处理文档服务之类的东西。像这样的东西。我之前对模型层的结构写了有点长的评论。你可能会发现它很有用。

  2. 看法

    您根据从路由机制收集的信息创建视图实例。如果您正在实现Model2HMVC,那么您的视图将需要构造函数中的Service Factory实例。

    如果您正在实现MVVMMVP,那么视图的构造函数没有特殊要求。

  3. 控制器

    这是您创建的最后一个结构,因为控制器负责将命令发送到视图层和模型层,然后更改然后更改两者的状态。因此控制器应该期望在构造函数中同时接收视图和服务工厂。

在初始化 MVC 的基本元素之后,调用控制器上的方法,并渲染当前视图。

请记住,这是非常简化的描述。

于 2012-07-27T15:38:29.513 回答
9

你真的可以把任何东西放在你想要的视图中,但为了更好地遵守 MVC 做事方式,你应该将视图中的 PHP 限制为简单echo的 s 或prints (也可能是非常小的循环,尽管即使是那些也可以是在控制器/模型中预先计算)。由于这是获取动态内容的唯一方法,因此说它们不被允许有点愚蠢。

视图的想法是让它具有更多的 HTML 外观,以便前端开发人员或不了解 PHP 的人可以轻松地处理文件而不会感到困惑。

更新

要了解有关 MVC 的更多信息,您可以查看其中任何一个(那里有大量教程):

http://blog.iandavis.com/2008/12/09/what-are-the-benefits-of-mvc/

http://php-html.net/tutorials/model-view-controller-in-php/

http://www.tonymarston.net/php-mysql/model-view-controller.html

要查看使用 MVC 的 PHP 的具体示例,我建议下载一些更流行的框架(例如CodeIgniterSymfonyDrupal)并查看代码。试着弄清楚它是如何工作的,然后为一个简单的基于文章的系统重新创建功能。

于 2012-07-27T13:53:47.197 回答