Yii组件机制之三:路由组件urlManager

本文深入介绍了Yii框架中的URL路由组件(urlManager)的工作原理与配置方法,包括如何通过URL找到对应的控制器与动作,以及如何根据参数生成URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Yii组件机制之三:路由组件 urlManager

 

URL路由,是指通过分析 URL,  找出请求的控制器及动作。路由信息就是指控制器及动作组成的请求字符串,形如 controllerID/ActionID

 

Yii中的路由主要有两重作用:

1. 根据请求 URL 找到应对的控制器及其方法

2. 根据提供的参数及规则生成 URL

这就称为路由双向解析。

 

支持两种形式的URL 解析:

1.   普通的get 传递参数方式,如 index.php?r=controller/action¶m1=value1

2.   path模式(需要服务器支持),如 index.php/name1/value1/name2/value2

 

 

URL路由处理由 urlManager 组件 ( 对应类名为 CUrlManager) 负责 它也是一个组件,故可以在配置文件中设置其属性:

$rules=array(); #url双向解析规则,这是最复杂的一项参数

$urlSuffix=''; #pathinfo 模式时的 url 后缀

$showScriptName=true; #是否在 URL 中显示脚本文件名称,当设置为 false 时需要服务器支持

$appendParams=true; #pathinfo模式下是否将参数追加到 URL 上,此项参数一般用于生成 URL 场景。设置为 true 参数将以斜线分隔并追加到路径后面。设为 false 时将以 query string 方式追加。

$routeVar='r'; #仅在 get 形式时有效,指定路由信息的变量名称

$caseSensitive=true; #路由信息是否区分大小写。如果设置为 false,  请求路由信息将被转换成小写,所以 CWebApplication::controllerMapCController::actions 、保存控制器的目录三者都应该使用小写。

$matchValue=false; #仅在 get 形式时有效。当创建 URLGET 参数的值应该匹配对应的子规则,这句话不好理解,后面会详细使用案例说明

$cacheID='cache'; #路由缓存所使用的组件名称(若使用缓存机制)

$useStrictParsing=false; #仅在 path 形式时有效,设置是否使用严格的 URL 解析。如果设置为 true,  则任何请求的 url 必须匹配 $rules 指定的规则,否则会引发 404 错误。

$urlRuleClass='CUrlRule'; #url规则处理组件类……

 

通过setter 方法定义的属性:

Urlformat : 设置 url 形式,可以是 get, path 两种方式

 

 

get模式是服务器默认支持的形式,故不需要规则解析,直接通过 $_GET[$this->routeVar] 变量即可取得路由信息,相对而言 path 模式是比较消耗资源的(因为需要逐条解析规则),所以我觉得在对性能要求较高的应用中,可以考虑使用 http server 的地址重写代替 yii 的规则,从而减少 yii 中昂贵的规则分析性能代价。掌握了其规则的定义,才能从根本上熟练使用路由组件。

一个规则是由路由和匹配样式组成的,一般地,每条规则的键名为规则,值为应对的路由,均可以配置文件中指定或在运行时指定,以下是几个例子:

'post/<id:\d+>/<title:.*?>'=>'post/view'

表示匹配post/\d+/.*? 规则的请求的路由为 post/view,  且将设置两个 GET 变量,分别为 $_GET['id']$_GET['title'],  指向对应的值。带尖括号的部分表示不仅要匹配而且要捕获值至变量中。

创建url 时,若指定路由为 post/view,  并提供 id, title( 可选 ) 参数,则将生成 post/$id/$title 形式的 url ,如:

$app->urlManager->createUrl('post/view', array(

'id'=>23,

'title'=>'title_text', 

'name1'=>'value1',

'name2'=>'value2'

));

将生成index.php/post/23/title_text?name1=value1&name2=value2

 

'posts/<tag:.*?>'=>'post/index'

匹配posts/.*? 的请求的路由将设置为 post/index,  同时将匹配的内容保存到 $_GET['tag'] 变量中。创建 URL 时若指定路由信息为 post/index,  并提供了 tag 参数(可选),则将生成 posts/$tag 形式 URL

 

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

匹配 \w+/\w+ 的请求 设置 $_GET['controller']$_GET['action'] 两个变量,并且路由信息中直接使用这两个变量的值作为路由信息。若指定 controlleraction 两个参数,参将创建形如 controller/action 形式的 URL

 

了解这些,是我们使用urlManager 组件的关键。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值