PHP MVC 框架教程

⚡ 智能摘要

PHP MVC 框架设计使用模型、视图和控制器将应用程序数据和业务逻辑与表示层分离。 CodeIgniter 使这种模式成为现实,让 PHP 开发人员能够更快地构建安全、易于维护的 Web 应用程序。

  • 🧩 模式: MVC 将应用程序拆分为模型(数据)、视图(表示)和控制器(请求处理),从而编写更简洁的代码。
  • 🚀 生产能力: 框架提供预构建的数据库访问、验证和输入清理库,因此团队可以更快地交付功能。
  • 🛠️ 选项: CodeIgniter、CakePHP 和 Laminas(以前称为 Zend)仍然是活跃的选择,而 Kohana 已于 2017 年停止开发。
  • 🗄️ 型号: In CodeIgniter 模型扩展了 CI_Model,并使用 Query Builder 方法进行安全的数据库操作。
  • 🎮 控制器: Controllers 继承自 CI_Controller,通过 input 类读取用户输入,并加载正确的视图。
  • 📈 影响: 移植一个普通的 PHP 轮询应用程序可以展示 MVC 结构如何减少重复工作并简化长期维护。

PHP MVC框架

什么是 PHP MVC 框架?

PHP MVC 是一种应用程序设计模式,它将应用程序数据和业务逻辑(模型)与表示(视图)分开。MVC 代表模型、视图和控制器。

控制器充当模型和视图之间的中介。

将 MVC 设计模式视为汽车和驾驶员。

汽车有挡风玻璃(视野),驾驶员(控制器)通过挡风玻璃来观察前方交通状况,然后根据前方情况加速或减速(模型)。

接下来,我们来看看为什么基于这种模式构建的框架值得使用。

为什么要使用 PHP MVC 框架?

PHP MVC框架通过以下方式简化了复杂技术的操作:

  • 隐藏所有复杂的实施细节
  • 提供我们可以用来构建应用程序的标准方法
  • 提高开发人员效率,因为连接数据库和清理用户输入等活动的基本实现已经部分完成。
  • 鼓励遵守专业编码标准

PHP MVC 设计模式

现在让我们简单讨论一下 MVC 设计模式的每个组件。

型号 – 此部分与业务逻辑和应用程序数据有关。它可用于执行数据验证、处理数据并存储数据。数据可以来自;

  • 平面文件
  • 数据库
  • XML 文档
  • 其他有效数据源。

控制器 – 这是处理用户向服务器请求资源的部分。

例如,当用户请求 URL …/index.php?products=list控制器将加载产品模型以检索产品数据,然后在列表视图中输出结果。

简而言之,控制器根据请求的资源将模型和视图链接在一起。

观看数 这部分主要负责向用户呈现数据,通常以HTML页面的形式呈现。

PHP MVC 框架的类型

选择最佳的 PHP 框架是一项挑战。

您无需编写自己的框架即可享受 MVC 的优势。

您应该只尝试创建自己的 MVC 相关应用程序设计,以了解 MVC 框架的工作原理。

一旦您熟悉了 MVC 框架的工作方式,您就应该转向成熟且已经过测试的框架。

下表简要介绍了一些流行的 PHP 框架以及每个框架提供的功能。

骨架 描述

Code点火器


Code点火器


https://codeigniter.com/

它是最流行的 PHP MVC 框架之一,目前已发展到第四个主要版本(CodeIgniter 4)。它轻量级且学习曲线平缓。它拥有丰富的库,可以帮助用户快速构建网站和应用程序。即使对面向对象编程 (OOP) 了解有限的用户也可以使用它。使用 Igniter 4 构建的应用程序。 Code点火器包括;


小花


小花


http://kohanaframework.org

这是一个安全、轻量级的分层模型-视图-控制器(HMVC)框架。 注意: Kohana 于 2017 年正式停止开发;其最后一个稳定版本是 3.3.6(2016 年 7 月)。社区分支 Koseven 继续维护其代码库。曾使用 Kohana 的公司包括:


CakePHP的


CakePHP的


www.cakephp.org

它以 Ruby on Rails 为蓝本,并持续维护至今(版本 5.x)。它以软件设计模式、约定优于配置、ActiveRecord 等概念而闻名。 CakePHP的 供电应用包括;


Zend公司

https://getlaminas.org/


Zend(现为 Laminas)

它是一个强大的框架;

  • 安全、可靠、快速、可扩展
  • 支持创建 Web 服务和 API。

它非常适合开发ping 商业应用。2020 年,Zend Framework 过渡到了开源的 Laminas 项目。基于 Zend/Laminas 的应用包括:

  • Pimcore CMS,
  • 点内核。

使用过 Zend 框架的公司包括:

  • 英国广播公司
  • Cisco
  • 网迅
  • Offers.com

PHP MVC框架与纯PHP:主要区别

框架在实践中究竟能带来哪些改变?纯 PHP 赋予你完全的自由,但每个项目最终都需要从头开始重新实现路由、验证和数据库访问。PHP MVC 框架则将这些重复性任务标准化,从而确保你的代码在不同项目和团队之间保持一致。

方面 纯 PHP PHP MVC框架
Code 组织 单个文件中混合了 HTML、SQL 和逻辑 分为模型、视图和控制器三部分
数据库访问 每页都有手写的查询 内置查询构建器或带有参数绑定的 ORM
安保防护 开发人员必须牢记所有安全措施。 包括输入过滤、XSS 和 CSRF 保护。
维护 文件的变化会以不可预测的方式扩散。 每层都可以独立改变。

👍 提示: 首先构建一个小型纯 PHP 项目,就像下面的民意调查一样;混合代码的痛苦使 MVC 分离的价值显而易见。

将民意调查应用程序移植到 Code点火器

在本 教程我们创建了一个 PHP 轮询应用程序。在这里,我们将把这段代码移植到 Code点火器

  • 下载 最新版本 Code他们的引燃器 网站。
  • Extrac将压缩文件的内容复制到 Web 服务器目录下的开发目录中。在本教程中,我们将使用 ciopinionpoll 作为文件夹名称。
  • 浏览到 URL http://localhost/ciopinionpoll/

Code在 ex 之后显示的 Igniter 欢迎页面trac框架

此 Code上面的 Igniter 欢迎页面确认框架已正确安装。现在我们将把我们的民意调查应用程序移植到 Code点火器。回想一下,我们的应用程序分为三个主要部分,即:

  • 前置控制器——这是响应以下指令的部件: URL 请求并返回所请求的页面。这段代码将放在控制器中。
  • 模型——这是响应数据请求并返回所请求数据的代码。这段代码将放入模型中。
  • 视图 – 这是负责格式化和显示数据的代码。此代码将进入视图

数据库配置设置

配置数据库连接:

  • 浏览至 ciopinionpoll 文件夹
  • 打开 数据库.php 文件位于 application/config 目录中。
  • 找到以下代码行

数据库配置设置 CodeIgniter 数据库.php 文件

  • 将用户名设置为root
  • 将密码设置为本地主机 root 密码
  • 将数据库名称设置为 opinion_poll。请注意,我们将使用上一课中创建的数据库。
  • 保存更改并关闭文件。

创建我们的模型

接下来,我们将创建扩展 CI_Model 的模型。CI_Model 是……的一部分 CodeIgniter库。模型将位于application/models目录下。 意见调查模型.php

<?php
class Opinion_poll_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function total_votes()
    {
        $query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
        return $query->row()->choices_count;
    }

    public function get_results()
    {
        $libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
        $table_rows = '';

        for ($i = 1; $i < 5; $i++)
        {
            $query = $this->db->select('COUNT(choice) as choices_count')
                              ->where('choice', $i)
                              ->get('js_libraries');

            $table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
        }

        return $table_rows;
    }

    public function add_vote($choice)
    {
        $ts = date("Y-m-d H:i:s");
        $data = array('choice' => $choice, 'ts' => $ts);
        $this->db->insert('js_libraries', $data);
    }
}
?>

这里,

  • “class Opinion_poll_model extends CI_Model…” 是扩展 CI_Model 的模型
  • “parent::__construct();” 调用 CI_Model 构造函数
  • “$this->load->database();” 加载数据库库,以便我们的应用程序可以与数据库交互
  • “$this->db->”是 CodeIgniter 的活跃记录。查看此内容 链接 有关活动记录的更多信息。

创建我们的控制器

现在我们来创建控制器。我们将使用默认的 CodeIgniter 控制器位于 application/controllers/welcome.php。请将其源代码替换为以下代码。

<?php

if (!defined('BASEPATH'))  exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct() {

        parent::__construct();

        $this->load->model('opinion_poll_model');

    }

    public function index() {

        if ($this->input->post('submitbutton') && !$this->input->post('vote')) {

            echo "<script>alert('You did not vote!');</script>";

        }

        if ($this->input->post('vote')) {

            $this->opinion_poll_model->add_vote($this->input->post('vote'));

            $data['total_votes'] = $this->opinion_poll_model->total_votes();

            $data['rows'] = $this->opinion_poll_model->get_results();

            $this->load->view('results', $data);

        } else {

            $this->load->view('opinion_poll_form');

        }

    }

}

/* End of file welcome.php */

/* Location: ./application/controllers/welcome.php */
?>

这里,

  • “if (!defined('BASEPATH')) exit('No direct script access allowed');” 确保用户不直接访问控制器类
  • “class Welcome extends CI_Controller…” 我们的控制器扩展了 CI_Controller 类
  • “public function __construct()” 调用 CI_Controller 类的构造函数方法并加载我们的 Opinion_poll_model 模型
  • “public function index()…” 是映射到 index.php 的函数。它使用 Code使用 Igniter 的输入类来检查是否已提交投票,如果已提交,则将其添加到数据库并显示结果。如果输入类的 post 数组为空,则加载投票页面。
  • “$this->input->post('…')”是 Code获取 $_POST 全局变量内容的 Igniter 输入类。
  • “$this->opinion_poll_model->add_vote($this->input->post('vote'))”调用模型的 add_vote 方法将投票添加到数据库中。

创建我们的视图

回想一下前面的例子,我们有两个 HTML 页面,一个用于投票,另一个用于显示结果。我们将使用相同的 HTML 代码,并稍作修改来创建我们的视图。在 application/views 目录中创建以下文件。

opinion_poll_form.php
<html>
<head>
    <title>
        JavaScript Libraries - Opinion Poll
    </title>
</head>

<body>
    <h2>JavaScript Libraries - Opinion Poll</h2>
    <p><b>What is your favorite JavaScript Library?</b></p>
    <form method="POST" action="index.php">
        <p>
            <input type="radio" name="vote" value="1" /> JQuery
            <br />
            <input type="radio" name="vote" value="2" /> MooTools
            <br />
            <input type="radio" name="vote" value="3" /> YUI Library
            <br />
            <input type="radio" name="vote" value="4" /> Glow </p>
        <p>
            <input type="submit" name="submitbutton" value="OK" />
        </p>
    </form>
</body>
</html>

现在让我们创建结果页面 results.php

<html>
    <head>
        <title>JavaScript Libraries - Opinion Poll Results</title>
    </head>
    <body>

        <h2>JavaScript Libraries - Opinion Poll Results</h2>

        <p><b>What is your favorite JavaScript Library?</b></p>

        <p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>

        <p><table><tr><td>

            <?php print($rows); ?>

        </tr></td></table></p>

        <p><a href="#">Return to voting page</a></p>
</body>
</html>

测试我们的应用

假设您的应用程序根目录为 ciopinionpoll,请浏览至 http://localhost/ciopinionpoll/

由以下机构提供的民意调查投票表 Code点火器应用程序

上面的投票页面来自我们的 opinion_poll_form 视图。如果您在不选择任何选项的情况下单击“确定”,您将看到以下提示信息。

当未选择任何投票时,会显示验证提示信息。

为你最喜欢的图书馆投票,然后点击“确定”。你将看到以下结果页面。

民意调查结果页面显示每人投票数 Java脚本库

这证实了这三层协同工作:控制器接收投票,模型存储并统计投票结果,视图显示总数。

常见问题

HMVC(分层模型-视图-控制器)将应用程序组织成可以相互调用的独立MVC三元组。诸如此类的框架 小花 HMVC之所以流行,是因为它有助于大型应用程序的模块化。

是的。 Laravel 目前最流行的 PHP MVC 框架。它遵循此处描述的模型-视图-控制器 (MVC) 分离模式,并添加了 Eloquent ORM 和 Blade 模板等工具。

是的。类似这样的工具 GitHub 副驾驶 可以根据提示生成模型、控制器和视图。但您仍然应该检查生成的代码是否存在安全问题,例如未转义的输出和 SQL 注入。

不。人工智能助手可以加快代码编写速度,但框架仍然提供经过验证的结构、安全默认设置和约定,以确保应用程序的可维护性。两者结合使用效果最佳。

序号 Code点火器 对面向对象编程经验有限的开发者来说非常友好。只需了解类、方法和基本继承即可掌握其模型-控制器模式。

总结一下这篇文章: