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::controllerMap 、 CController::actions 、保存控制器的目录三者都应该使用小写。
$matchValue=false; #仅在 get 形式时有效。当创建 URL 前 GET 参数的值应该匹配对应的子规则,这句话不好理解,后面会详细使用案例说明
$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'] 两个变量,并且路由信息中直接使用这两个变量的值作为路由信息。若指定 controller 及 action 两个参数,参将创建形如 controller/action 形式的 URL 。
了解这些,是我们使用urlManager 组件的关键。