文档章节

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

Yomut
 Yomut
发布于 2016/07/15 17:10
字数 597
阅读 8
收藏 0

 

在上一课中,我们实现了简单的根据 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!

本文转载自:http://www.cnblogs.com/zhenyu-whu/p/3166284.html

共有 人打赏支持
Yomut
粉丝 19
博文 191
码字总数 167789
作品 0
厦门
后端工程师
私信 提问
CodeIgniter框架环境配置

之前连续搭了好几个项目,觉得用CodeIgniter框架搭建项目已经非常熟悉了。今天想再单独弄一个环境,用作PHP技术的学习和实践平台,却发现之前“熟记”的过程都快放的差不多了,怎么都安装不成...

Claire_level
2012/05/14
0
0
使用 CodeIgniter 创建 Facebook 应用程序

本文向您演示了如何让 Facebook 示例应用程序与 PHP 框架 - CodeIgniter 共同工作。虽然有许多有关 Facebook 开发的好文章,当然,也有一些有关使用 CodeIgniter 来构建应用程序的好文章,但...

IBMdW
2011/07/12
1K
0
PHP 框架 CodeIgniter 发布 2.0 版

今天,EllisLab 和 CodeIgniter Reactor 的工程师们自豪的宣布:CodeIgniter 2.0.0 的第一个官方版本发布了!它有两个版本(或分支): CodeIgniter Core 版 Core 版是一个更新较慢的分支,它...

红薯
2011/01/30
1K
7
CodeIgniter + uploadify 在 IE 下会话丢失问题的解决方案

最近需要学习并用CodeIgniter框架对一个项目进行二次开发,由于之前一直都是使用Symfony做项目,所以再换到CodeIgniter项目上还是比较顺畅的。不过相比较之下,感觉CodeIgniter比Symfony要轻...

random123
2014/06/23
0
0
CodeIgniter 4 宣布开发路线图

我们综合考虑了社区的愿望和意见后,也对什么样的未来对 CI 是最合适的做了一些思考,然后,CI 理事会对框架的未来做出了一些决策。预告一下,未来将会有重大变化,但我们相信他们不仅为我们...

CodeIgniter中国
2016/03/24
7.8K
32

没有更多内容

加载失败,请刷新页面

加载更多

linux 服务管理 Crontba、Ntpdate、Logrotate、Supervisor

crond linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。 另外, 由于使用者自己也可以设置计划任务,所以,...

狼王黄师傅
34分钟前
1
0
Sobel算子和Scharr滤波器

Sobel算子在数学上的本质是微分,对离散信号,是求邻域内的增量。 基本原理:在图像上,对图像信号在某点进行微分,表示图像的某个特征(如,强度、色调或者饱和度)在该点的变换程度。以强度...

yepanl
50分钟前
1
0
Jenkins API 使用

Jenkins 是一款流行的开源持续集成工具,可以用来做一些软件开发的自动化工作,如打包,测试,自动部署等。 Jenkins 中有 view 和 job 的概念, view 相当于组, job 则是具体的任务。 view...

YanWen
51分钟前
5
0
聊聊jest的NodeChecker

序 本文主要研究一下jest的NodeChecker NodeChecker jest-common-6.3.1-sources.jar!/io/searchbox/client/config/discovery/NodeChecker.java public class NodeChecker extends AbstractS......

go4it
58分钟前
3
0
深入分析String.intern和String常量的实现原理

背景 字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现...

群星纪元
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部