基本的MVC(PHP)结构

Cra*_*son 8 php model-view-controller

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

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

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

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

目前我的观点是静态HTML(没有PHP),所以这是我的问题.然后向用户传递欢迎信息的正确方法是什么,例如"Hello,Craig!"?

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

<?php echo $username; ?> 
Run Code Online (Sandbox Code Playgroud)

既然模型在控制器文件中加载之前呢?

谢谢!

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

<?php $user->getUsername(); ?>
Run Code Online (Sandbox Code Playgroud)

而不仅仅是变量?


基于其他答案,我发现了一篇非常有用的文章,您可能也会感兴趣.

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

ter*_*ško 19

以下是您必须考虑的一些事项:

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

在基于Web的MVC中查看

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

视图从模型层接收信息,并相应地采取行动.模型层中的信息如何在视图中结束的方式是MVC-ish模式中最重要的差异之一:

  • 经典的MVC模式

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

  • Model2 MVCHMVC模式

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

  • MVVMMVP模式

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

你现在看起来实际上只是一个模板.与此类似,本文对此进行了描述.您最终得到的结构无法包含表示逻辑.从长远来看,这将导致表示逻辑被推入控制器.

那么"欢迎"的消息呢?

要显示欢迎消息,您的视图应从模型层请求当前用户的名称.如果模型层返回某种错误状态,则视图选择错误消息模板并插入布局.

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

零件的装载顺序是什么?

控制器应初始化模型和视图的想法来自对MVC的非常原始的解释.模式知道为页面控制器,它试图直接在静态网页上移植MVC.

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

  1. 模型

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

  2. 视图

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

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

  3. 调节器

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

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

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


Jef*_*ert 8

你可以在你想要的视图中放置任何东西,但是为了更好地遵循MVC的做法,你应该将视图中的PHP限制为简单的echos或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的具体示例,我建议下载一些更优秀的框架(例如CodeIgniter,SymfonyDrupal)并查看代码.尝试弄清楚它是如何工作的,然后为简单的基于文章的系统重新创建功能.

  • 另外,你为什么链接到Symfony 1.x网站?Lemme猜测,你听说开发人员"symfony相当不错",但他们并不知道1.x和2.x版本有多么不同. (3认同)
  • 当然.这一切都与关注点分离有关,因为你和其他任何人都不知道将来会发生什么事情(你可能会让你的项目失去人员,或者认为对于只知道HTML的人来说更便宜).此外,该架构通过严格仅允许某些信息进入表示层,有助于提高安全性. (2认同)
  • @Mayankswami如果你想学习正确的方法,无论你做什么都不要使用Codeingiter作为指导.你可能想看[Symfony2](https://github.com/symfony/symfony/)它是那些更好(更不好)的那个. (2认同)
  • -1表示像codeigniter和drupal这样可怕的代码片段.并链接到歪曲MVC模式的教程. (2认同)