Model-View-Controller (MVC) 架构模式详解及 PHP 实现示例
核心要点
MVC 模式最初在 20 世纪 70 年代后期提出,是一种软件架构模式,其基础是将数据的展示与与数据交互的方法分开。理论上,一个完善的 MVC 系统应该允许前端开发人员和后端开发人员在同一系统上工作而不会相互干扰、共享或编辑任何一方正在处理的文件。尽管 MVC 最初是为个人计算设计的,但由于其强调关注点分离,以及间接地,可重用代码,因此已被 Web 开发人员广泛采用。这种模式鼓励开发模块化系统,允许开发人员快速更新、添加甚至删除功能。在本文中,我将介绍 MVC 的基本原理,对该模式的定义进行概述,并快速介绍 MVC 在 PHP 中的示例。这篇文章绝对适合任何以前从未使用 MVC 进行编码的人,或者那些想要复习以前 MVC 开发技能的人。
理解 MVC
该模式的名称是其三个核心部分的组合:模型 (Model)、视图 (View) 和控制器 (Controller)。完整正确的 MVC 模式的可视化表示如下所示:
该图显示了数据的单向流程布局,数据如何在各个组件之间传递,以及各个组件之间如何工作。
模型 (Model)
模型是指在整体设计中使用的数据的永久存储。它必须允许访问要查看或收集和写入的数据,并且是 MVC 模式中视图组件和控制器组件之间的桥梁。模型的一个重要方面是它在技术上是“盲目”的——我的意思是模型与数据传递到视图或控制器组件后发生的事情没有连接或了解。它既不调用也不寻求其他部分的响应;它的唯一目的是将数据处理到其永久存储中,或者查找和准备要传递给其他部分的数据。然而,模型不能简单地概括为数据库,或处理数据过程的另一个系统的网关。模型必须充当数据的看门人,不问任何问题,但接受所有请求。模型组件通常是 MVC 系统中最复杂的部分,也是整个系统的核心,因为如果没有它,控制器和视图之间就没有连接。
视图 (View)
视图是查看从模型请求的数据并确定其最终输出的地方。传统上,在使用 MVC 构建的 Web 应用程序中,视图是生成和显示 HTML 的系统部分。视图还会引发用户的反应,然后用户继续与控制器交互。一个基本的例子是由视图生成的按钮,用户点击该按钮并在控制器中触发一个操作。关于视图组件,特别是使用 MVC 模式构建其应用程序的 Web 开发人员,存在一些误解。例如,许多人误以为视图与模型没有任何连接,并且视图显示的所有数据都是从控制器传递的。实际上,这种流程完全忽略了 MVC 模式背后的理论。Fabio Cevasco 的文章《CakePHP 框架:你的第一次尝试》展示了在 CakePHP 框架中对 MVC 的这种混淆方法,这是一个可用的许多非传统 MVC PHP 框架的例子:
“需要注意的是,为了正确应用 MVC 架构,模型和视图之间不能有交互:所有逻辑都由控制器处理”
此外,将视图描述为模板文件是不准确的。然而,正如 Tom Butler 指出,这不是一个人的错,而是许多开发人员犯的许多错误,导致开发人员学习 MVC 不正确。然后他们继续错误地教育他人。视图实际上远不止是一个模板,但是现代 MVC 启发的框架几乎已经使视图变得面目全非,以至于没有人真正关心框架是否真正遵循正确的 MVC 模式。同样重要的是要记住,视图部分永远不会从控制器接收数据。正如我在讨论模型时提到的那样,如果没有中间的模型,视图和控制器之间就没有直接关系。
控制器 (Controller)
三元组的最后一个组件是控制器。它的工作是处理用户输入或提交的数据,并相应地更新模型。控制器的生命线是用户;如果没有用户交互,控制器就没有目的。它是用户应该与之交互的模式的唯一部分。控制器可以简单地概括为信息的收集器,然后将其传递给模型进行组织以进行存储,并且不包含除收集输入所需的逻辑之外的任何其他逻辑。控制器也只连接到单个视图和单个模型,使其成为单向数据流系统,在每个数据交换点进行握手和签字。重要的是要记住,只有当用户首先与视图交互时,控制器才会获得执行任务的指令,并且每个控制器的功能都是由用户与视图的交互触发的触发器。开发人员最常犯的错误是将控制器误认为是网关,并最终为其分配视图应该承担的功能和责任(这通常是同一个开发人员将视图组件简单地误认为是模板的结果)。此外,一个常见的错误是为控制器提供功能,使其独自负责从模型到视图的数据压缩、传递和处理,而在 MVC 模式中,这种关系应该保持在模型和视图之间。
PHP 中的 MVC
可以使用基于 MVC 模式的架构编写 PHP Web 应用程序。让我们从一个简单的例子开始:
<?php class Model { public $string; public function __construct() { $this->string = "MVC + PHP = Awesome!"; } }
<?php class View { private $model; private $controller; public function __construct($controller, $model) { $this->controller = $controller; $this->model = $model; } public function output() { return "<p>" . $this->model->string . "</p>"; } }
<?php class Controller { private $model; public function __construct($model) { $this->model = $model; } }
我们已经开始了一个项目,其中包含每个模式部分的一些非常基本的类。现在我们需要设置它们之间的关系:
<?php $model = new Model(); $controller = new Controller($model); $view = new View($controller, $model); echo $view->output();
正如您在上面的示例中看到的,我们没有任何特定于控制器的功能,因为我们没有为我们的应用程序定义任何用户交互。视图包含所有功能,因为该示例纯粹用于显示目的。现在让我们扩展该示例以显示如何向控制器添加功能,从而向应用程序添加交互性:
<?php class Model { public $string; public function __construct() { $this->string = "MVC + PHP = Awesome, click here!"; } public function updateString($newString) { $this->string = $newString; } }
<?php class View { private $model; private $controller; public function __construct($controller, $model) { $this->controller = $controller; $this->model = $model; } public function output() { return '<p><a href="https://www.php.cn/link/5ca1b0a18c411c3ebfc35c9dad7da921">' . $this->model->string . "</a></p>"; } }
<?php class Controller { private $model; public function __construct($model) { $this->model = $model; } public function clicked() { $this->model->updateString("Updated Data, thanks to MVC and PHP!"); } }
我们使用一些基本功能增强了应用程序。现在设置组件之间的关系如下所示:
<?php $model = new Model(); $controller = new Controller($model); $view = new View($controller, $model); if (isset($_GET['action']) && !empty($_GET['action'])) { $controller->{$_GET['action']}(); } echo $view->output();
运行代码,当您点击链接时,您将能够看到字符串更改其数据。
结论
我们已经介绍了 MVC 模式背后的基本理论,并创建了一个非常基本的 MVC 应用程序,但是在我们进入任何细致的功能之前,我们还有很长的路要走。在本系列的下一篇文章中,我们将介绍在尝试在 PHP 的 Web 上创建真正的 MVC 应用程序时面临的一些选择。敬请期待!图片来自 Fotolia 本文的评论已关闭。关于 MVC 模式和 PHP 有问题吗?为什么不在我们的论坛上提问呢?
PHP MVC 模式的常见问题解答 (FAQ)
模型-视图-控制器 (MVC) 模式是一种设计模式,它将应用程序分成三个相互关联的组件。这种分离允许开发人员修改或更新一个组件而不影响其他组件。在 PHP 中,MVC 模式特别有用,因为它可以组织代码,使其更易于维护和扩展。它还可以提高数据管理和用户界面设计的效率。
在 PHP 中,MVC 模式通过将应用程序划分为三个组件来工作。模型处理数据和业务逻辑,视图管理用户界面和数据的呈现,控制器处理用户请求并相应地更新模型和视图。这种关注点分离允许更有效地管理代码并更容易进行调试。
在 PHP 项目中实现 MVC 模式包括为模型、视图和控制器创建单独的文件或类。模型将包含用于访问和操作数据的函数,视图将包含用于显示数据的 HTML 和 PHP 代码,控制器将包含用于处理用户输入和更新模型和视图的函数。
有几个流行的 PHP MVC 框架可以帮助您在项目中实现 MVC 模式。这些包括 Laravel、Symfony、CodeIgniter 和 CakePHP。这些框架提供了一种结构化且有效的方式来使用 MVC 模式构建 Web 应用程序。
使用 PHP MVC 框架提供了许多好处。它提供了一种组织代码的结构化方式,使其更易于维护和扩展。它还为常见任务提供了内置函数和库,从而减少了您需要编写的代码量。此外,MVC 框架通常包含安全功能,可以保护您的应用程序免受常见的 Web 漏洞攻击。
在 PHP MVC 中,控制器充当模型和视图之间的中介。当用户发出请求时,控制器会解释该请求并调用相应的模型函数来处理数据。然后,它会更新视图以反映数据中的任何更改。
在 PHP MVC 中,用户输入通常由控制器处理。控制器接收用户输入,对其进行验证,然后将其传递给模型进行处理。然后,模型更新数据并通知控制器,控制器又更新视图。
在 PHP MVC 中,数据通过使用 PHP 和 HTML 代码在视图中显示。控制器从模型中检索数据并将其传递给视图,然后视图生成 HTML 来显示数据。
在 PHP MVC 中,模型中的数据通过控制器调用的函数进行更新。这些函数可以包括创建、读取、更新和删除数据等操作。
确保您的 PHP MVC 应用程序安全涉及多个步骤。这些步骤包括验证和清理用户输入,使用预准备语句或参数化查询来防止 SQL 注入,以及使用 MVC 框架的内置安全功能。同样重要的是,要使您的框架和任何依赖项保持最新,以防范已知的漏洞。
以上是PHP主| MVC模式和PHP,第1部分的详细内容。更多信息请关注PHP中文网其他相关文章!