一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能
在上一课中,我们实现了简单的根据 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!
一步一步重写 CodeIgniter 框架 (2) —— 实现简单的路由功能的更多相关文章
- 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库
通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ...
- 一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View
1. 控制器将模型类获得的数据,传递给视图进行显示,所以视图必须负责接收数据,另外重要的一点是当模型和视图分开后,多个模型的数据可以传递给一个视图进行展示,也可以说一个模型的数据在多个不同的视图中进行 ...
- 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model
CodeIgniter 框架采用MVC模式,而MVC模式中起纽带作用的就是C(控制器),在控制器的中通过加载模型获得数据,将数据传到视图中进行展示.本课将实现在控制器中加载模型. 1. 控制器的实现 ...
- 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路
我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ...
- 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码
前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...
- 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法
CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容.那么我们第一课中就是实现一个这样的原 ...
- 利用 Composer 一步一步构建自己的 PHP 框架(二)——构建路由
本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 上一篇中我们已经建立了一个空的 Composer 项目 ...
- 一步一步重写 CodeIgniter 框架 (12) —— 代码再重构,回归 CI
第一课中搭建的基本的 框架模型, 只有一个 index.php 作为执行文件,按这种方式最不稳定的因素就是路径的问题. 我们经常需要通过合适的参数,比如 load_class('output') 或 ...
- 一步一步重写 CodeIgniter 框架 -- 原因和思路
CodeIgniter 是一个非常轻量级的 PHP 框架,说是轻量级,最新版的代码只有不到2M. 其最重要的特点就是 MVC 模式来编写代码,如果大家看过一些用 PHP 来编写网站的书籍或教程,无一例 ...
随机推荐
- C# Best Practices - Define Fields Appropriately
Backing Fields private string description; private int productId; Features A variable in a class Hol ...
- C#_会员管理系统:开发七(用户分类)
登录界面(VIPLogin.cs)详细代码: using System; using System.Collections.Generic; using System.ComponentModel; ...
- Apache JMeter开源压力测试/负载测试工具 2.12 官方最新版
软件介绍 Jmeter是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试),而且用Jmeter 来测试 Restful API, 非常好用. 如何学 ...
- C++对C语言的非面向对象特性扩充(1)
我将分3篇来介绍C++相对于C在非对象特性上的扩充,今天要讲的是C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较. 1.C++注释除了包括原有C的块注释/* ...
- .NET参数化Oracle查询参数
最近在做数据库移植工作(SqlServer 2008 -> Oracle 11g),遇到一些不兼容的问题,以下是一个参数化方面的区别,资料来自其他网友,在此整理了一下. public stati ...
- 如何用java比较两个时间或日期的大小
有一个字符串的时间,比如"2012-12-31 16:18:36" 与另一个时间做比较,如果前者比后者早,则返回true,否则返回false. 为此,我设计了一个方法. impor ...
- thinkphp 常用的查询
php 常用的数据库查询方式: //根据where 条件查询,使用select()方法 访问:http://localhost/thinkphp2/index.php/Machine/search_i ...
- cocos2dx进阶学习之坐标转换
在cocos2dx中,有四种坐标系 GL坐标系:左下为原点,x轴向右,y轴向上 UI坐标系:左上为原点,x轴向右,y轴向下 世界坐标系:与GL坐标系相同 本地坐标系:是节点(CCNode)的坐标系,原 ...
- 1104--DNA排序
问题描述: 逆序数可以用来描述一个序列混乱程度的量.例如,“DAABEC”的逆序数为5,其中D大于它右边的4个数·,E大于它右边的1的个数,4+1=5,又如,“ZWQM”的逆序数为3+2+1+0=6. ...
- 如何安装系统认证签名过的APK
如果你的App因为权限原因需要设置 android:sharedUserId="android.uid.system" 那么IDE编译出的包通常是无法直接安装的,查看控制台会发现报 ...