在上一课中,我们实现了简单的根据 URI 执行某个类的某个方法。但是这种映射没有扩展性,对于一个成熟易用的框架肯定是行不通的。那么,我们可以让 框架的用户 通过自定义这种转换来控制,用 CI 的术语就是 ”路由“。

1. 路由具体负责做什么的?

 举个例子,上一课中 http://localhost/learn-ci/index.php/welcome/hello, 会执行 Welcome类的 hello 方法,但是用户可能会去想去执行一个叫 welcome 的函数,并传递 'hello' 为参数。

 更实际一点的例子,比如你是一个产品展示网站, 你可能想要以如下 URI 的形式来展示你的产品,那么肯定就需要重新定义这种映射关系了。

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

2. 实现一个简单的路由

  1) 新建 routes.php 文件,并在里面定义一个 routes 数组,routes 数组的键值对即表示路由映射。比如

1 /**
2  * routes.php 自定义路由
3  */
4
5 $routes['default_controller'] = 'home';
6
7 $routes['welcome/hello'] = 'welcome/saysomething/hello';

  2) 在 index.php 中包含 routes.php

1 include('routes.php');

  3) 两个路由函数,分析路由 parse_routes ,以及映射到具体的方法上去 set_request

 1 function parse_routes() {
 2     global $uri_segments, $routes, $rsegments;
 3
 4     $uri = implode('/', $uri_segments);
 5
 6     if (isset($routes[$uri])) {
 7         $rsegments = explode('/', $routes[$uri]);
 8
 9         return set_request($rsegments);
10     }
11 }
12
13 function set_request($segments = array()) {
14     global $class, $method;
15
16     $class = $segments[0];
17
18     if (isset($segments[1])) {
19         $method = $segments[1];
20     } else {
21         $method = 'index';
22     }
23 }

4) 分析路由,执行路由后的函数,通过 call_user_func_array() 函数

1 parse_routes();
2
3 $CI = new $class();
4
5 call_user_func_array(array(&$CI, $method), array_slice($rsegments, 2));

5) 给 Welcome 类添加 saysomething 函数做测试

 1 class Welcome {
 2
 3     function hello() {
 4         echo 'My first Php Framework!';
 5     }
 6
 7     function saysomething($str) {
 8         echo $str.", I'am the php framework you created!";
 9     }
10 }

测试结果: 访问 http://localhost/learn-ci/index.php/welcome/hello ,可以看到与第一课不同的输出结果

hello, I'am the php framework you created!

转载于:https://www.cnblogs.com/zhenyu-whu/p/3166284.html

一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能相关推荐

  1. python flask框架下登录注册界面_Python的Flask框架中实现简单的登录功能的教程

    Python 的 Flask 框架中实现简单的登录功能的教程 , 登录是各个 web 框架中的基础功能 , 需要的朋友可以参考下 回顾 在前面的系列章节中, 我们创建了一个数据库并且学着用用户和邮件来 ...

  2. 一步一步重写 CodeIgniter 框架 (8) —— 视图的嵌套输出与返回

    视图函数在控制器中通过 $this->load-view() 来调用,从而输出 html,有时候为了调试或附加处理的需要,我们需要打印出这些输出,而不是直接通过浏览器输出,这在 php 中是通过 ...

  3. php 的 yii 框架,详解PHP的Yii框架的运行机制及其路由功能

    运行机制概述每一次 Yii 应用开始处理 HTTP 请求时,它都会进行一个近似的流程. 用户提交指向 入口脚本 web/index.php 的请求. 入口脚本会加载 配置数组 并创建一个 应用 实例用 ...

  4. 菜鸟的蜕变:教你一步一步创建基于laravel5的简易论坛系统(3)

    上篇文章我已经带大家熟悉了laravel框架的基本结构.路由功能.控制器.视图等各个部分交互方式,这篇文章继续带大家做一下其他页面. 创建帖子内容页和个人主页路由,增加 Route::get('art ...

  5. 设计php框架_利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC

    利用 Composer 一步一步构建自己的 PHP 框架(三)--设计 MVC 2014-10-14 / 阅读数:50438 / 分类: PHP 终于可以 "一次编写,到处发布" ...

  6. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  7. composer mysql_利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM

    利用 Composer 一步一步构建自己的 PHP 框架(四)--使用 ORM 2014-10-16 / 阅读数:65457 / 分类: PHP 回顾 经过前三篇文章 基础准备 . 构建路由 和 设计 ...

  8. 利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过前三篇文章 基础准备 . 构建路由 和 设计 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务...

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

最新文章

  1. php留言板源码免mysql_PHPMYSQL留言板源码(终极完整版).doc
  2. 【ARM】arm串行通信
  3. 【告别信】三年了,是该离开了!
  4. 一个空的C++类中有什么
  5. vue 导入公共css_HTML+CSS入门 vue引入通用CSS
  6. 每天工作的第一个小时,做什么?
  7. SpringCloud学习笔记020---MongoDb之json与bson的区别
  8. 软件设计开发思想总结
  9. 大家为什么去国企后都不想跳槽了?
  10. 你很熟悉CSS,却没掌握这些CSS技巧
  11. 新时代程序员——怎么样应对吃青春饭问题
  12. 抖音算法推荐机制详解(科普向)
  13. 高分子物理考研概念及要点、考点总结
  14. 读张满胜之《英语语法新思维初级教程》
  15. 如何打开mysql数据库?
  16. 量子计算机原理 不确定,逃避量子物理学中的不确定性原理
  17. 数字PID控制算法原理及Matlab仿真
  18. 二手MacBook笔记本回收数量的提升,也是用户环保意识的增强
  19. 小白mybatis学习(三)输出结果配置
  20. 抖音创作规范_抖音作品在内容规划是应该要注意的一些问题分析

热门文章

  1. 使用JMAP dump及分析dump文件
  2. [译] 构建流畅的交互界面
  3. linux 查看系统信息命令
  4. Linux配置JDK1.7和Resin4.0
  5. Android颜色选择器库
  6. 关于Oracle的提示详解(1)
  7. Ora-00600 错误的代码含义及常用查询
  8. Linux 命令(64)—— strings 命令
  9. Linux 命令(23)—— rm 命令
  10. c#类中字段和方法中变量的声明问题