博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CI框架 -- URI 路由
阅读量:5892 次
发布时间:2019-06-19

本文共 1830 字,大约阅读时间需要 6 分钟。

一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系。 URL 中的每一段通常遵循下面的规则:example.com/class/function/id/

但是有时候,你可能想改变这种映射关系,调用一个不同的类和方法,而不是 URL 中对应的那样。

例如,假设你希望你的 URL 变成下面这样:

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

URL 的第二段通常表示方法的名称,但在上面的例子中,第二段是一个商品 ID , 为了实现这一点,CodeIgniter 允许你重新定义 URL 的处理流程。

设置你自己的路由规则

路由规则定义在 application/config/routes.php 文件中,在这个文件中你会 发现一个名为 $route 的数组,利用它你可以设置你自己的路由规则。 在路由规则中你可以使用通配符正则表达式

 

通配符

一个典型的使用通配符的路由规则如下:

$route['product/:num'] = 'catalog/product_lookup';

在一个路由规则中,数组的键表示要匹配的 URI ,而数组的值表示要重定向的位置。 上面的例子中,如果 URL 的第一段是字符串 "product" ,第二段是个数字,那么, 将调用 "catalog" 类的 "product_lookup" 方法。

你可以使用纯字符串匹配,或者使用下面两种通配符:

(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段。(除了 '/' 字符,因为它是段与段之间的分隔符)

注:

1、通配符实际上是正则表达式的别名,:any 会被转换为 [^/]+ , :num 会被转换为 [0-9]+ 。

2、路由规则将按照它们定义的顺序执行,前面的规则优先级高于后面的规则。

3、路由规则并不是过滤器!设置一个这样的路由:'foo/bar/(:num)' , Foo 控制器的 bar 方法还是有可能会通过一个非数字的参数被调用 (如果这个路由也是合法的话)。

例子

$route['journals'] = 'blogs';

URL 的第一段是单词 "journals" 时,将重定向到 "blogs" 类。

$route['blog/joe'] = 'blogs/users/34';

URL 包含 blog/joe 的话,将重定向到 "blogs" 类和 "users" 方法。ID 参数设为 "34" 。

$route['product/(:any)'] = 'catalog/product_lookup';

URL 的第一段是 "product" ,第二段是任意字符时,将重定向到 "catalog" 类的 "product_lookup" 方法。

$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';

URL 的第一段是 "product" ,第二段是数字时,将重定向到 "catalog" 类的 "product_lookup_by_id" 方法,并将第二段的数字作为参数传递给它。

不要在前面或后面加反斜线('/')。

 

正则表达式

如果你喜欢,你可以在路由规则中使用正则表达式。任何有效的正则表达式都是 允许的,包括逆向引用。

注:如果你使用逆向引用,你需要使用美元符号代替双斜线语法。

一个典型的使用正则表达式的路由规则看起来像下面这样:

$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';

上例中,一个类似于 products/shirts/123 这样的 URL 将会重定向到 "shirts" 控制器的 "id_123" 方法。

使用正则表达式,你还可以匹配含有反斜线字符('/')的段,它通常来说是 多个段之间的分隔符。

例如,当一个用户访问你的 Web 应用中的某个受密码保护的页面时,如果他没有 登陆,会先跳转到登陆页面,你希望在他们在成功登陆后重定向回刚才那个页面, 那么这个例子会很有用:

$route['login/(.+)'] = 'auth/login/$1';

注:你也可以在你的路由规则中混用通配符和正则表达式。

转载地址:http://bonsx.baihongyu.com/

你可能感兴趣的文章
Angular - - ngList、ngRepeat、ngModelOptions
查看>>
[LeetCode136]Single Number寻找一个数组里只出现一次的数
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
bootstrap - image
查看>>
spring-boot 和 webpack-dev-server联合开发
查看>>
从TimSort说起
查看>>
构建 iOS 界面:子类化 Views
查看>>
笨办法学C 练习1:启用编译器
查看>>
用Golang写一个搜索引擎(0x01)--- 基本概念
查看>>
【算法之美】logn 时间复杂度求解两个有序数组的中位数
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
docker环境搭建ELK
查看>>
webpack sourcemap 选项多种模式的一些解释
查看>>
document.createElement()的用法
查看>>
MySQL 数据库怎样把一个表的数据插入到另一个表
查看>>
HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
查看>>
nginx正则笔记
查看>>
delphi实现数字的倒计时
查看>>
在 IIS 下添加 FLV 类型文件的支持
查看>>
java线程学习3——线程的停止
查看>>