CodeIgniter 控制器、视图和路由:通过示例应用程序学习
在本教程中,您将学习以下主题。
- 路由 – 路由负责响应URL请求。路由将URL与预定义的路由匹配。如果没有找到匹配的路由,CodeIgniter将抛出“未找到页面”异常。
- 控制器 – 路由与控制器相关联。控制器将模型和视图连接在一起。请求来自模型的数据/业务逻辑,并以视图的形式返回结果。一旦URL与路由匹配,它将被转发到控制器的公共函数。该函数与数据源、业务逻辑交互,并返回显示结果的视图。
- 视图 – 视图负责演示。视图通常是HTML、CSS和JavaScript的组合。这是负责向用户显示网页的部分。通常,显示的数据是从数据库或任何其他可用数据源检索的。
如何创建新的CodeIgniter项目
我们将使用Composer创建一个新项目。我将使用PHP内置服务器,因此无需额外的软件,例如Apache。在本教程中,我们使用的是Windows操作系统。因此,我们在C盘上创建了一个Sites文件夹。您可以使用任何适合您的目录。
打开命令行/终端并运行以下命令
cd C:\Sites
现在我们将使用Composer创建一个CodeIgniter项目。运行以下命令
composer create-project CodeIgniter/framework ci-app
此处,
- 上面的命令使用最新的稳定版本(3.1.9)创建了一个CodeIgniter项目版本3,该项目位于ci-app目录中。
当上面的命令运行完成后,您应该能在终端中看到类似以下的结果
运行以下命令浏览新创建的项目目录ci-app
cd ci-app
现在让我们启动PHP内置Web服务器
php -S localhost:3000
此处,
- 上面的命令启动了一个运行在端口3000上的内置PHP服务器。
在Web浏览器中打开并浏览以下URL:https://:3000/
您将看到以下页面
如果您能看到上面的页面,那么恭喜您,您已成功安装CodeIgniter。
如您在上面网页中看到的那样,上面显示的页面是由位于application/views/welcome_message.php的视图渲染的,而负责的控制器位于application/controllers/Welcome.php。
CodeIgniter路由
目前,我们的应用程序只有一个URL,那就是主页。在本节中,我们将自定义主页部分。我们将创建一些新的URL来响应不同的请求。
让我们从主页路由开始
打开路由文件,路径如下
application/config/routes.php
您应该能看到以下内容
$route['default_controller'] = 'welcome'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE;
此处,
- $route[‘default_controller’] = ‘welcome’; 定义了响应URI请求的默认控制器
- $route[‘404_override’] = ”; 此路由允许您为404错误定义自定义路由。当找不到页面时,会发生404错误。CodeIgniter有一个默认的错误处理程序,但如果您愿意,可以定义自己的。
- $route[‘translate_uri_dashes’] = FALSE; 此选项允许您将连字符翻译成下划线。当我们讨论CodeIgniter中的路由工作原理时,我们将详细介绍此选项。
现在让我们看看负责显示我们在浏览器中打开URL https://:3000/
时看到的首页的控制器方法。
打开以下文件
application/controllers/Welcome.php
您应该能看到以下代码
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Welcome extends CI_Controller { public function index() { $this->load->view('welcome_message'); } }
此处,
- Defined (‘BASEPATH’) OR exit(‘No direct script access allowed’); 可防止直接访问控制器类而不经过index.php文件。请记住,在MVC范式中,所有请求都有一个单一的入口点,对于CodeIgniter来说,它的入口点是index.php。这段代码会阻止所有未通过index.php发送的请求。
- class Welcome extends CI_Controller {…} 定义了一个名为Welcome的类,该类继承了父类CI_Controller。
- public function index() 定义了一个公共函数,当您打开主页时,该函数会被默认调用。
- $this->load->view(‘welcome_message’); 这一行加载了视图welcome_message。文件welcome_message位于目录application/views/welcome_message.php。
到目前为止,我们只探索了CodeIgniter自带的功能,现在让我们尝试做一些更改。我们将创建自己的主页并替换默认页面。
在application/views/home.php中创建一个新文件
将以下代码添加到home.php
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Hello CodeIgniter!</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> </head> <body> <section class="section"> <div class="container"> <h1 class="title"> CodeIgniter Hello World </h1> </div> </section> </body> </html>
此处,
上面的HTML代码从CDN网络加载Burma SSS框架和字体,创建了一个非常基础的HTML文档。它应用了Burma CSS框架中非常简单的CSS规则。
在浏览器中打开以下URL:https://:3000/
您应该能看到以下内容
太棒了,我们刚刚成功修改了主页。接下来,让我们定义我们的路由。假设我们的应用程序还需要显示“关于我们”页面。
创建路由
打开路由文件application/config.routes.php
添加以下路由
$route['about-us'] = 'welcome/about_us';
此处,
- 当访问者访问URL /about-us时,我们指示CodeIgniter查找控制器Welcome并执行方法about_us。
创建控制器
现在让我们定义about us控制器方法
打开application/controllers/Welcome.php
添加以下方法
public function about_us(){ $this->load->view('about_us'); }
此处,
- 上面的代码定义了一个about_us函数并加载了一个about_us视图。
创建视图
现在让我们创建上面部分引用的视图
在application/views/about_us.php中创建一个新文件about_us.php
添加以下代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>About CodeIgniter!</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> </head> <body> <section class="section"> <div class="container"> <h1 class="title"> About us yap... </h1> </div> </section> </body> </html>
一切就绪,在您的Web浏览器中打开以下URL:https://:3000/index.php/about-us
您将看到以下页面
如果您能看到上面的页面,那么恭喜您,您已成功创建了一个CodeIgniter的简单应用程序。
摘要
在本教程中,我们涵盖了构成CodeIgniter应用程序的三个主要组件。我们研究了路由及其定义方法,控制器及其创建响应路由请求的方法,以及创建在用户请求资源时返回的简单视图。