路由地址
路由地址定義
| 版本 | 新增功能 |
|---|---|
| 5.0.4 | 路由到類和控制器的方法支持傳入額外參數 |
路由地址(zhi)表(biao)(biao)示定(ding)(ding)義(yi)的(de)路由表(biao)(biao)達式最終需(xu)要(yao)路由到的(de)地址(zhi)以及一些需(xu)要(yao)的(de)額外參數(shu),支持(chi)下面(mian)5種方式定(ding)(ding)義(yi):
| 定義方式 | 定義格式 |
|---|---|
| 方式1:路由到模塊/控制器 | '[模塊/控制器/操作]?額外參數1=值1&額外參數2=值2...' |
| 方式2:路由到重定向地址 | '外部地址'(默認301重定向) 或者 ['外部地址','重定向代碼'] |
| 方式3:路由到控制器的方法 | '@[模塊/控制器/]操作' |
| 方式4:路由到類的方法 | '\完整的命名空間類::靜態方法' 或者 '\完整的命名空間類@動態方法' |
| 方式5:路由到閉包函數 | 閉包函數定義(支持參數傳入) |
其中(zhong)方式(shi)5我們將(jiang)會在(zai)下一個章節閉包支持中(zhong)詳(xiang)細(xi)描述(shu)。
路由到模塊/控制器/操作
這是最常用的(de)一種路由方式,把滿足條件(jian)的(de)路由規則路由到(dao)相關的(de)模塊、控(kong)制器和操作,然后由App類調度執(zhi)行相關的(de)操作。
同時會(hui)進(jin)行模塊的初始化操(cao)作(包括配置(zhi)讀(du)取(qu)、公共文件載(zai)入、行為定義載(zai)入、語(yu)言包載(zai)入等(deng)等(deng))。
路由地(di)址的(de)格式為(wei):
[模塊/控制器/]操作?參數1=值1&參數2=值2...
解析規則是從(cong)操作開始解析,然后解析控制器,最后解析模塊,例如:
// 路由到(dao)默認(ren)或(huo)者綁定模(mo)塊
'blog/:id'=>'blog/read',
// 路由到index模塊(kuai)
'blog/:id'=>'index/blog/read',
Blog類定義如(ru)下:
namespace app\index\controller;
class Blog {
public function read($id){
return 'read:'.$id;
}
}
路由(you)地址中支(zhi)持多級控制(zhi)器,使用下(xia)面的方式進行設置(zhi):
'blog/:id'=>'index/group.blog/read'
表示(shi)路(lu)由(you)到下面的控制(zhi)器類,
index/controller/group/Blog
Blog類(lei)定義如下:
namespace app\index\controller\group;
class Blog {
public function read($id){
return 'read:'.$id;
}
}
還可以支持路(lu)由(you)到動態的模(mo)塊(kuai)、控制(zhi)器(qi)或者操作,例如:
// action變量的值作為操作方法傳(chuan)入
':action/blog/:id' => 'index/blog/:action'
// 變量傳(chuan)入index模塊的控制器和操作方法
':c/:a'=> 'index/:c/:a'
如果關閉路由功能(neng)的話,默認也會(hui)按(an)照該規則對URL進行解析調(diao)度。
額外參數
在(zai)這種方式路由(you)跳轉(zhuan)的時(shi)(shi)候(hou)支(zhi)持額外(wai)傳入(ru)參(can)數對(額外(wai)參(can)數指的是不在(zai)URL里面(mian)的參(can)數,隱式傳入(ru)需要的操作中,有時(shi)(shi)候(hou)能(neng)夠(gou)起到一定的安全防護作用,后面(mian)我們(men)會提到)。例如(ru):
'blog/:id'=>'blog/read?status=1&app_id=5',
上面的路由規則定義中額外參數status和app_id參數都是URL里面不(bu)存在(zai)的(de),屬于隱式傳值,當然并(bing)不(bu)一定需(xu)要用到,只是在(zai)需(xu)要的(de)時候可以使用。
路由到操作方法
路由(you)地(di)址的格式為:
@[模塊/控制器/]操作
這種方式看起來似乎和第一種是一樣的,本質的區別是直接執行某個控制器類的方法,而不需要去解析 模塊/控制器/操作(zuo)這些,同時也不會去初始化模塊。
例如,定義如下路由(you)后:
'blog/:id'=>'@index/blog/read',
系統(tong)會(hui)直接執行
Loader::action('index/blog/read');
相當于(yu)直接調(diao)用 \app\index\controller\blog類(lei)的read方法。
Blog類定義如下:
namespace app\index\controller;
class Blog {
public function read($id){
return 'read:'.$id;
}
}
通(tong)常這(zhe)種方式下面,由于(yu)沒有定義當(dang)前(qian)模(mo)(mo)(mo)塊名、當(dang)前(qian)控(kong)制器名和(he)當(dang)前(qian)方法名 ,從而導致視(shi)圖的默認模(mo)(mo)(mo)板規則(ze)失效,所以這(zhe)種情況下面,如(ru)果使用了視(shi)圖模(mo)(mo)(mo)板渲染,則(ze)必須傳入明確的參(can)數。
路由到類的方法
路由(you)地址的格式為(動(dong)態方法):
\類的命名空間\類名@方法名
或者(靜態方法(fa))
\類的命名空間\類名::方法名
這種方(fang)式更(geng)進(jin)一步,可以支持執行任何類的方(fang)法,而不僅(jin)僅(jin)是執行控制器的操作方(fang)法,例如:
'blog/:id'=>'\app\index\service\Blog@read',
執行的是 \app\index\service\Blog類的read方法。
也支持(chi)執(zhi)行某個靜態方法(fa),例如:
'blog/:id'=>'\app\index\service\Blog::read',
V5.0.4+版本開始,支持傳入額(e)外(wai)的參(can)數作為方法的參(can)數調用(yong)(用(yong)于(yu)參(can)數綁定),例如:
'blog/:id'=>'\app\index\service\Blog::read?status=1',
路由到重定向地址
重(zhong)定(ding)向的(de)(de)外部地址必須以“/”或者http開頭(tou)的(de)(de)地址。
如果路由地址(zhi)以(yi)“/”或者“http”開頭(tou)則會認(ren)為是一(yi)個重定(ding)向地址(zhi)或者外部地址(zhi),例如:
'blog/:id'=>'/blog/read/id/:id'
和
'blog/:id'=>'blog/read'
雖然都是路由到同一個地址,但是前者采用的是301重定向的方式路由跳轉,這種方式的好處是URL可以比較隨意(包括可以在URL里面傳入更多的非標準格式的參數),而后者只是支持模塊和操作地址。舉個例子,如果我們希望avatar/123重定向到
/member/avatar/id/123_small的話,只能使用:
'avatar/:id'=>'/member/avatar/id/:id_small'
路由地址采用重定向地址的話,如(ru)果要引用動(dong)態(tai)變量,直(zhi)接使用動(dong)態(tai)變量即可。
采用重定(ding)向到外部(bu)地址通常對網站改版后的(de)URL遷移過(guo)程非常有用,例如:
'blog/:id'=>'//blog.thinkphp.cn/read/:id'
表(biao)示當前網站(zhan)(可能是(shi)//thinkphp.cn )的 blog/123地址(zhi)會直(zhi)接重(zhong)定向(xiang)到
