搜索
首页后端开发php教程PHP主| MVC模式和PHP,第1部分

Model-View-Controller (MVC) 架构模式详解及 PHP 实现示例

核心要点

  • MVC 模式是一种软件架构模式,它将数据的展示与与数据交互的方法分离,允许前端和后端开发人员在同一系统上工作而互不干扰。
  • 由于其强调关注点分离和可重用代码,MVC 已被应用于 Web 开发,它鼓励开发模块化系统,以便快速更新、添加或删除功能。
  • MVC 模式包含三个核心部分:模型 (Model)、视图 (View) 和控制器 (Controller)。模型是数据的永久存储,视图是查看数据并确定其最终输出的地方,控制器处理用户输入或提交的数据,并相应地更新模型。
  • 可以使用 MVC 模式编写 PHP Web 应用程序。这涉及为模型、视图和控制器创建单独的类,并设置它们之间的关系。

MVC 模式最初在 20 世纪 70 年代后期提出,是一种软件架构模式,其基础是将数据的展示与与数据交互的方法分开。理论上,一个完善的 MVC 系统应该允许前端开发人员和后端开发人员在同一系统上工作而不会相互干扰、共享或编辑任何一方正在处理的文件。尽管 MVC 最初是为个人计算设计的,但由于其强调关注点分离,以及间接地,可重用代码,因此已被 Web 开发人员广泛采用。这种模式鼓励开发模块化系统,允许开发人员快速更新、添加甚至删除功能。在本文中,我将介绍 MVC 的基本原理,对该模式的定义进行概述,并快速介绍 MVC 在 PHP 中的示例。这篇文章绝对适合任何以前从未使用 MVC 进行编码的人,或者那些想要复习以前 MVC 开发技能的人。 PHP Master | The MVC Pattern and PHP, Part 1

理解 MVC

该模式的名称是其三个核心部分的组合:模型 (Model)、视图 (View) 和控制器 (Controller)。完整正确的 MVC 模式的可视化表示如下所示:PHP Master | The MVC Pattern and PHP, Part 1

该图显示了数据的单向流程布局,数据如何在各个组件之间传递,以及各个组件之间如何工作。

模型 (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)

PHP 中 MVC 模式的意义是什么?

模型-视图-控制器 (MVC) 模式是一种设计模式,它将应用程序分成三个相互关联的组件。这种分离允许开发人员修改或更新一个组件而不影响其他组件。在 PHP 中,MVC 模式特别有用,因为它可以组织代码,使其更易于维护和扩展。它还可以提高数据管理和用户界面设计的效率。

MVC 模式如何在 PHP 中工作?

在 PHP 中,MVC 模式通过将应用程序划分为三个组件来工作。模型处理数据和业务逻辑,视图管理用户界面和数据的呈现,控制器处理用户请求并相应地更新模型和视图。这种关注点分离允许更有效地管理代码并更容易进行调试。

如何在我的 PHP 项目中实现 MVC 模式?

在 PHP 项目中实现 MVC 模式包括为模型、视图和控制器创建单独的文件或类。模型将包含用于访问和操作数据的函数,视图将包含用于显示数据的 HTML 和 PHP 代码,控制器将包含用于处理用户输入和更新模型和视图的函数。

一些流行的 PHP MVC 框架有哪些?

有几个流行的 PHP MVC 框架可以帮助您在项目中实现 MVC 模式。这些包括 Laravel、Symfony、CodeIgniter 和 CakePHP。这些框架提供了一种结构化且有效的方式来使用 MVC 模式构建 Web 应用程序。

使用 PHP MVC 框架的好处是什么?

使用 PHP MVC 框架提供了许多好处。它提供了一种组织代码的结构化方式,使其更易于维护和扩展。它还为常见任务提供了内置函数和库,从而减少了您需要编写的代码量。此外,MVC 框架通常包含安全功能,可以保护您的应用程序免受常见的 Web 漏洞攻击。

控制器如何在 PHP MVC 中与模型和视图交互?

在 PHP MVC 中,控制器充当模型和视图之间的中介。当用户发出请求时,控制器会解释该请求并调用相应的模型函数来处理数据。然后,它会更新视图以反映数据中的任何更改。

如何在 PHP MVC 中处理用户输入?

在 PHP MVC 中,用户输入通常由控制器处理。控制器接收用户输入,对其进行验证,然后将其传递给模型进行处理。然后,模型更新数据并通知控制器,控制器又更新视图。

如何在 PHP MVC 的视图中显示数据?

在 PHP MVC 中,数据通过使用 PHP 和 HTML 代码在视图中显示。控制器从模型中检索数据并将其传递给视图,然后视图生成 HTML 来显示数据。

如何在 PHP MVC 的模型中更新数据?

在 PHP MVC 中,模型中的数据通过控制器调用的函数进行更新。这些函数可以包括创建、读取、更新和删除数据等操作。

如何确保我的 PHP MVC 应用程序安全?

确保您的 PHP MVC 应用程序安全涉及多个步骤。这些步骤包括验证和清理用户输入,使用预准备语句或参数化查询来防止 SQL 注入,以及使用 MVC 框架的内置安全功能。同样重要的是,要使您的框架和任何依赖项保持最新,以防范已知的漏洞。

以上是PHP主| MVC模式和PHP,第1部分的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
高流量网站的PHP性能调整高流量网站的PHP性能调整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依赖注入:初学者的代码示例PHP中的依赖注入:初学者的代码示例May 14, 2025 am 12:08 AM

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

PHP性能:是否可以优化应用程序?PHP性能:是否可以优化应用程序?May 14, 2025 am 12:04 AM

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

PHP性能优化:最终指南PHP性能优化:最终指南May 14, 2025 am 12:02 AM

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

PHP依赖注入容器:快速启动PHP依赖注入容器:快速启动May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依赖注入与服务定位器PHP中的依赖注入与服务定位器May 13, 2025 am 12:10 AM

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

PHP性能优化策略。PHP性能优化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP电子邮件验证:确保正确发送电子邮件PHP电子邮件验证:确保正确发送电子邮件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器