在上一课中,我们实现了简单的根据 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 数组的键值对即表示路由映射。比如

 /**
* routes.php 自定义路由
*/ $routes['default_controller'] = 'home'; $routes['welcome/hello'] = 'welcome/saysomething/hello';

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

 include('routes.php');

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

 function parse_routes() {
global $uri_segments, $routes, $rsegments; $uri = implode('/', $uri_segments); if (isset($routes[$uri])) {
$rsegments = explode('/', $routes[$uri]); return set_request($rsegments);
}
} function set_request($segments = array()) {
global $class, $method; $class = $segments[0]; if (isset($segments[1])) {
$method = $segments[1];
} else {
$method = 'index';
}
}

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

 parse_routes();

 $CI = new $class();

 call_user_func_array(array(&$CI, $method), array_slice($rsegments, 2));

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

 class Welcome {

     function hello() {
echo 'My first Php Framework!';
} function saysomething($str) {
echo $str.", I'am the php framework you created!";
}
}

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

hello, I'am the php framework you created!

最新文章

  1. [LeetCode] Combination Sum IV 组合之和之四
  2. Daily Scrum Meeting ——SecondDay(Beta)12.10
  3. way.js - 轻量级、持久化的双向绑定JS库
  4. 外媒速递:十大最佳心理学概念助你提升Web设计效果
  5. 设计模式:单例模式(Singleton)
  6. (三)获取iphone的IMSI
  7. mvc annotation-driven作用
  8. Struts2 删除后直接直接到List显示页面
  9. php中JPGraph入门配置与应用
  10. 使用PHPExcel导入导出excel格式文件
  11. slots
  12. NodeMCU入门(4):搭建Web服务器,配置网络连接
  13. Longge's problem poj2480 欧拉函数,gcd
  14. Codeforces Round #203 (Div. 2)B Resort
  15. ELF 文件 动态链接 - 地址无关代码(GOT)
  16. 微信小程序音乐播放
  17. android 7.0+ FileProvider 访问隐私文件 相册、相机、安装应用的适配
  18. 移动APP测试入手点
  19. myBase7.0破解
  20. SQL SERVER 查询表的各字段长度

热门文章

  1. warensoft unity3d 更新说明
  2. OpenCASCADE Job - Shoe Doctor
  3. 百度api短信开发
  4. js展开一颗树
  5. 蓝桥杯 算法训练 区间k大数查询(水题)
  6. iOS正则匹配手机号
  7. 开启.htaccess重写之前先来看看mod_rewrite(转)
  8. javascript 获取滚动条高度+常用js页面宽度与高度(转)
  9. c 判断水仙花数,质数(素数)
  10. C--全排列的实现(递归方法) 傻子也能看懂的
  11. linux 文件系统操作()
  12. 201521123019 《Java程序设计》第7周学习总结
  13. 201621123062《java程序设计》第七周作业总结
  14. CSS3属性之圆角效果——border-radius属性
  15. 5.3、Android Studio录像
  16. Dynamics CRM 注册插件dll到GAC
  17. Html5 Canvas介绍
  18. python kafka权限校验client.id
  19. [tool] Visual Studio Code python配置
  20. [转]Win7 + Ubuntu 18.04 LTS (Bionic Beaver)双系统安装方法