PHP MVC 框架教程:CodeIgniter 示例
什么是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框架之一。它轻巧且学习曲线短。它拥有丰富的库集,可以帮助快速构建网站和应用程序。知识有限的OOP编程用户也可以使用它。CodeIgniter支持的应用程序包括: |
|
它是一个分层模型视图控制器 HMVC 安全轻量级框架。它具有丰富的组件集,可用于快速开发应用程序。使用Kohana的公司包括: |
|
它模仿了Ruby on Rails。它以软件设计模式、约定优于配置、ActiveRecord等概念而闻名。CakePHP支持的应用程序包括: |
|
它是一个强大的框架,具有:
它提供了来自Amazon、Google、Flickr、Yahoo等供应商的API。它是开发业务应用程序的理想选择。Zend支持的应用程序包括:
使用Zend框架的公司包括:
|
将意见调查应用程序移植到CodeIgniter
在本教程中,我们创建了一个PHP投票应用程序。在这里,我们将把代码移植到CodeIgniter
- 从其网站下载最新版本的CodeIgniter。
- 将zip文件的内容提取到您Web服务器目录中的开发目录中。在本课中,我们将使用ciopinionpoll作为文件夹名称。
- 浏览到URL https:///ciopinionpoll/
我们现在将把意见调查应用程序移植到CodeIgniter。回想一下,我们的应用程序分为三个主要组件,即:
- 前端控制器 – 这是响应URL请求并返回请求页面的部分。此代码将放入控制器
- 模型 – 这是响应数据请求并返回请求数据的代码。此代码将放入模型
- 视图 – 这是负责格式化和显示数据的代码。此代码将放入视图
- 浏览到ciopinionpoll文件夹
- 打开位于application/config目录中的database.php文件。
- 找到以下代码行
数据库配置设置
- 将用户名设置为root
- 将密码设置为您的localhost root密码
- 数据库名称设置为opinion_poll。请注意,我们将使用上一课中创建的数据库。
- 保存更改并关闭文件。
创建我们的模型
接下来,我们将创建扩展CI_Model的模型。CI_Model是CodeIgniter库的一部分。模型将位于application/models opinion_poll_model.php
<?php class Opinion_poll_model extends CI_Model { public function __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++) { $sql_stmt = "SELECT COUNT(choice) choices_count FROM js_libraries WHERE choice = $i;"; $result = $model-> select($sql_stmt); $table_rows .= "<tr><td>" . $ libraries [$i] . " Got:</td><td><b>" . $result[0] . "</b> votes</td></tr>"; } 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的Active Record。有关Active Record的更多信息,请查看此链接。
创建我们的控制器 现在我们来创建控制器。我们将使用位于application/controllers/welcome.php中的默认CodeIgniter控制器。将其源代码替换为以下代码。
<?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的函数。它使用CodeIgniter的input类来检查是否提交了投票,将其添加到数据库,然后显示结果。如果input类的post数组为空,它会加载投票页面。
- “$this->input->post(‘…’)” 是CodeIgniter的input类,用于获取$_POST全局变量的内容。
- “$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>
测试我们的应用程序
假设您的应用程序的根目录是ciopinion,请浏览到https:///ciopionpoll/
单击OK按钮,您将看到以下警报消息
为你最喜欢的候选人投票,然后点击OK。你将看到以下结果页面
结论
CodeIgniter是一个易于学习和使用的PHP MVC框架,可以大大减少开发应用程序所需的时间。
CodeIgniter是一个易于学习和使用的PHP MVC框架,可以大大减少开发应用程序所需的时间。
摘要
- 框架是一组库,它们提供了常见任务的部分实现。
- PHP有许多开源的成熟且经过测试的MVC框架。
- 良好的开发方法是将数据与表示分离,并鼓励使用应用程序的单一入口点。
- 遵循应用程序设计最佳实践的传统PHP应用程序可以以最小的修改移植到MVC框架。