PHP MVC 框架教程
⚡ 智能摘要
PHP MVC 框架设计使用模型、视图和控制器将应用程序数据和业务逻辑与表示层分离。 CodeIgniter 使这种模式成为现实,让 PHP 开发人员能够更快地构建安全、易于维护的 Web 应用程序。
什么是 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 框架以及每个框架提供的功能。
| 骨架 | 描述 |
|---|---|
|
|
它是最流行的 PHP MVC 框架之一,目前已发展到第四个主要版本(CodeIgniter 4)。它轻量级且学习曲线平缓。它拥有丰富的库,可以帮助用户快速构建网站和应用程序。即使对面向对象编程 (OOP) 了解有限的用户也可以使用它。使用 Igniter 4 构建的应用程序。 Code点火器包括;
|
|
这是一个安全、轻量级的分层模型-视图-控制器(HMVC)框架。 注意: Kohana 于 2017 年正式停止开发;其最后一个稳定版本是 3.3.6(2016 年 7 月)。社区分支 Koseven 继续维护其代码库。曾使用 Kohana 的公司包括: |
|
它以 Ruby on Rails 为蓝本,并持续维护至今(版本 5.x)。它以软件设计模式、约定优于配置、ActiveRecord 等概念而闻名。 CakePHP的 供电应用包括; |
|
|
它是一个强大的框架;
它非常适合开发ping 商业应用。2020 年,Zend Framework 过渡到了开源的 Laminas 项目。基于 Zend/Laminas 的应用包括:
使用过 Zend 框架的公司包括:
|
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上面的 Igniter 欢迎页面确认框架已正确安装。现在我们将把我们的民意调查应用程序移植到 Code点火器。回想一下,我们的应用程序分为三个主要部分,即:
- 前置控制器——这是响应以下指令的部件: URL 请求并返回所请求的页面。这段代码将放在控制器中。
- 模型——这是响应数据请求并返回所请求数据的代码。这段代码将放入模型中。
- 视图 – 这是负责格式化和显示数据的代码。此代码将进入视图
数据库配置设置
配置数据库连接:
- 浏览至 ciopinionpoll 文件夹
- 打开 数据库.php 文件位于 application/config 目录中。
- 找到以下代码行
- 将用户名设置为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/
上面的投票页面来自我们的 opinion_poll_form 视图。如果您在不选择任何选项的情况下单击“确定”,您将看到以下提示信息。
为你最喜欢的图书馆投票,然后点击“确定”。你将看到以下结果页面。
这证实了这三层协同工作:控制器接收投票,模型存储并统计投票结果,视图显示总数。









