php - 基本 MVC (PHP) 结构

标签 php model-view-controller

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

用户访问 Controller PHP文件。 Controller包括model.php和view.php

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

用户已登录,并由 Controller 转发到不同的 View (登录成功消息)。

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

View 是否允许 PHP 片段,例如

<?php echo $username; ?> 

因为模型在 Controller 文件中先于它加载?

谢谢!

编辑: 允许 View 访问特定的类方法是否更好,例如

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

而不仅仅是变量?


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

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

最佳答案

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

  • 您不能在 PHP 中执行传统的 MVC。相反,我们有 MVC 启发的模式
  • 当为 web 实现时, View 和 Controller 实例之间存在 1:1 的关系
  • MVC 中的模型不是类。它是一个层,包含很多不同的类
  • View 不是哑模板,而是类的实例,它处理表示逻辑

在基于 Web 的 MVC 中查看

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

View 从模型层接收信息,并据此采取行动。来自模型层的信息如何在 View 中结束的方式是 MVC-ish 模式中最显着的差异之一:

  • 经典 MVC 模式

    当模型状态发生变化时,模型层的结构将信息发送给 View 。这是通过 observer pattern 完成的.

  • Model2 MVCHMVC 模式

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

  • MVVMMVP 模式

    View 通过 Controller 接收信息, Controller 又从模型层请求它。模式的进一步差异源于在将数据传递给 View 之前如何处理数据。

你现在看起来拥有的其实只是一个模板。与 this article 中描述的类似.您最终得到一个结构,该结构没有地方包含表示逻辑。从长远来看,这将导致呈现逻辑被推送到 Controller 中。

那么“欢迎”信息呢?

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

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

应按什么顺序加载零件?

The idea, that controller should initialize model and view, comes from very primitive interpretation of MVC for web. Pattern know as page controller, which tried to graft MVC directly on static web pages.

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

  1. 模型

    您初始化结构,通过它您将处理模型层。它很可能是某种服务工厂,它可以让您构建诸如用于登录的 Authentication 服务和用于处理文档的 Library 服务之类的东西。像这样的东西。我写的有点长comment on model layer's structure更早。您可能会发现它很有用。

  2. 查看

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

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

  3. 控制者

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

初始化 MVC 的基本元素后,调用 Controller 上的方法,并呈现当前 View 。

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

关于php - 基本 MVC (PHP) 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689155/

相关文章:

php - 使用内置的 laravel 5.3 功能或 dingo 来创建 API?

asp.net-mvc - MVC 数据安全

model-view-controller - MVC 与 Flux ?双向与单向?

javascript - Recurly.js - PHP 客户端 - 数字签名

php - WordPress 通知 : non object property

php - 通过 PHP 大量插入 MySQL 数据库会跳过名称

silverlight - 在 ASP.Net MVC 的 View 中使用 Silverlight - 一个坏主意?

c# - 如何将服务器 session 从 Razor MVC C# 传递到 Angularjs?

model-view-controller - 精简 Symfony2 Controller 和持久化逻辑

php - 从 Azure 存储 blob 下载文件的简单 PHP cURL 方法