基本MVC(PHP)结构


Basic MVC (PHP) Structure

对于一个简单的登录表单,我有以下数据流

用户访问控制器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

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

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

基于Web的MVC中的视图

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

视图接收来自模型层的信息,并相应地执行操作。来自模型层的信息最终显示在视图中的方式是MVC模式中最显著的区别之一:

  • 经典MVC模式

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

  • Model2 MVCHMVC模式

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

  • MVVMMVP模式

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

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

那么"欢迎"的信息呢

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

如果从模型层中检索到用户的名称而没有问题,请查看包含问候语的模板,在模板中设置值并进行渲染。

零件的装载顺序是什么

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

在我看来,这应该是订单:

  1. 型号

    初始化结构,通过该结构处理模型层。它很可能是某种服务工厂,允许您构建用于登录的Authentication服务和用于处理文档的Library服务。诸如此类的事情。我早些时候写了一篇关于模型层结构的有点长的评论。你可能会发现它很有用。

  2. 查看

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

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

  3. 控制器

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

MVC的基本元素初始化后,在控制器上调用一个方法,并呈现当前视图。

请记住,这是一个非常简单的描述。

您确实可以在视图中放置任何您想要的东西,但为了更好地遵守MVC的做事方式,您应该将视图中的PHP限制为简单的echoprint(可能也非常小的循环,尽管这些循环甚至可以在控制器/模型中预先计算)。既然这是获取动态内容的唯一途径,那么说它们不被允许就有点傻了。

视图的想法是让它有一个更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的具体示例,我建议下载一些以前的框架(如CodeIgniter、Symfony或Drupal),然后浏览代码。试着弄清楚它是如何工作的,然后为一个简单的基于文章的系统重新创建功能。