路由定義
注冊路由規則
路由(you)注冊(ce)可以(yi)采用方法(fa)動態(tai)單個和批量注冊(ce),也可以(yi)直接定義路由(you)定義文件的(de)方式進(jin)行集(ji)中(zhong)注冊(ce)。
動態注冊
路由定義采用\think\Route類的rule方法注冊,通常是在應用的路由配置文件application/route.php進行注冊,格式是:
Route::rule('路由表達式','路由地址','請求類型','路由參數(數組)','變量規則(數組)');
例(li)如注(zhu)冊(ce)如下路由規則:
use think\Route;
// 注冊路由到index模塊的News控制器的read操作
Route::rule('new/:id','index/News/read');
我們訪問:
http://serverName/new/5
ThinkPHP5.0的(de)路由規則定義是從根目錄開始,而(er)不是基(ji)于模(mo)塊名的(de)。
會自動路由到(dao):
http://serverName/index/news/read/id/5
并且原來的訪問地址(zhi)會自動失效(xiao)。
路(lu)由表達式(第一個參數)支持定(ding)義命名(ming)標識,例(li)如:
// 定義new路由命名標識
Route::rule(['new','new/:id'],'index/News/read');
注(zhu)意(yi),路由命(ming)名(ming)標識必(bi)須唯一,定義后可以(yi)用于URL的快速生(sheng)成(cheng)。
可以(yi)在(zai)rule方法中指定請求類(lei)型(xing),不指定的話(hua)默認為(wei)任何請求類(lei)型(xing),例如:
Route::rule('new/:id','News/update','POST');
表(biao)示定義的(de)路由規則在POST請求下才有效。
請(qing)求類型(xing)包括:
| 類型 | 描述 |
|---|---|
| GET | GET請求 |
| POST | POST請求 |
| PUT | PUT請求 |
| DELETE | DELETE請求 |
| * | 任何請求類型 |
注(zhu)意:請求類型參數必(bi)須(xu)大寫。
系統提供了為不(bu)同的(de)請求類(lei)型(xing)定義(yi)路由規則的(de)簡化(hua)方法(fa),例如:
Route::get('new/:id','News/read'); // 定義GET請求路由規則
Route::post('new/:id','News/update'); // 定義POST請求路由規則
Route::put('new/:id','News/update'); // 定義PUT請求路由規則
Route::delete('new/:id','News/delete'); // 定義DELETE請求路由規(gui)則
Route::any('new/:id','News/read'); // 所有請求都支(zhi)持的路由規則
如果要定義get和(he)post請求支(zhi)持的路由(you)規則(ze),也可以用:
Route::rule('new/:id','News/read','GET|POST');
我們也可以批量注冊路由規則,例如:
Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);
注(zhu)冊多個路由規(gui)(gui)則(ze)后,系統會依次遍歷注(zhu)冊過的滿足請求類型的路由規(gui)(gui)則(ze),一旦匹配到正確(que)的路由規(gui)(gui)則(ze)后則(ze)開(kai)始(shi)調用控制器的操作方法,后續規(gui)(gui)則(ze)就不再檢測。
路由表達式
路由表達式統一(yi)使字(zi)符串(chuan)定(ding)義,采用規則定(ding)義的方(fang)式。
正則路由定義功(gong)能已經廢除,改由變量(liang)規則定義完成(cheng)。
規則表達式
規則表(biao)達式(shi)通常包含靜態(tai)地址和(he)動態(tai)地址,或者兩種地址的(de)結合,例如下(xia)面(mian)都屬于有效的(de)規則表(biao)達式(shi):
'/' => 'index', // 首頁訪問(wen)路由
'my' => 'Member/myinfo', // 靜態地址路由
'blog/:id' => 'Blog/read', // 靜(jing)態地址(zhi)和動態地址(zhi)結合(he)
'new/:year/:month/:day'=>'News/read', // 靜態地址和(he)動態地址結合
':user/:blog_id'=>'Blog/read',// 全(quan)動(dong)態地址
規則表達式的定義以/為參數分割符(無論你的PATH_INFO分隔符設置是什么,請確保在定義路由規則表達式的時候統一使用/進(jin)行URL參(can)數分割)。
每個參(can)數中以“:”開頭的參(can)數都表示動(dong)態變(bian)量,并且會自動(dong)綁定到操作方法的對應參(can)數。
可選定義
支(zhi)持對路由參數的可選定義(yi),例如:
'blog/:year/[:month]'=>'Blog/archive',
[:month]變量用[ ]包含起來后就表(biao)示(shi)該變量(liang)是路由匹配的可(ke)選(xuan)變量(liang)。
以上定(ding)義(yi)路(lu)由規則(ze)后,下面的URL訪問地址都(dou)可以被(bei)正確的路(lu)由匹配:
http://serverName/index.php/blog/2015
http://serverName/index.php/blog/2015/12
采用可(ke)選(xuan)變量定義后,之(zhi)前需要定義兩個或者多個路(lu)(lu)由規則才能處理的情況可(ke)以合并為一個路(lu)(lu)由規則。
可選參(can)數只能(neng)放到路由(you)規則的最(zui)后,如(ru)果(guo)在中間使用了可選參(can)數的話(hua),后面的變(bian)量都(dou)會變(bian)成(cheng)可選參(can)數。
完全匹配
規則匹配檢測的時候只是對URL從頭開始匹配,只要URL地址包含了定義的路由規則就會匹配成功,如果希望完全匹配,可以在路由表達式最后使用$符號,例如:
'new/:cate$'=> 'News/category',
http://serverName/index.php/new/info
會匹配(pei)成功(gong),而
http://serverName/index.php/new/info/2
則(ze)不會匹配(pei)成功。
如果是采用
'new/:cate'=> 'News/category',
方式定義的話,則兩種方式的URL訪問都可以匹配成功。
如(ru)果你希望所(suo)有的路(lu)由定義(yi)都是完全(quan)匹配(pei)的話(hua),可(ke)以直接配(pei)置(zhi)
// 開啟路由(you)定義的全局(ju)完全匹配(pei)
'route_complete_match' => true,
當開啟全局(ju)完(wan)全匹配的時候,如果(guo)個別路由(you)不需(xu)要(yao)使用完(wan)整匹配,可以添加路由(you)參數覆蓋定義:
Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
額外參數
在路(lu)由跳轉(zhuan)的(de)(de)時候(hou)支持額(e)外(wai)傳入(ru)參(can)數對(dui)(額(e)外(wai)參(can)數指的(de)(de)是不在URL里面的(de)(de)參(can)數,隱式傳入(ru)需要(yao)的(de)(de)操作中,有時候(hou)能夠起到(dao)一定的(de)(de)安全防護作用,后(hou)面我們會提到(dao))。例如:
'blog/:id'=>'blog/read?status=1&app_id=5',
上面的路由規則定義中額外參數的傳值方式都是等效的。status和app_id參數都是(shi)URL里(li)面不存(cun)在的(de),屬(shu)于(yu)隱(yin)式(shi)傳值,當然(ran)并不一定需(xu)要(yao)用(yong)到,只是(shi)在需(xu)要(yao)的(de)時候可以使(shi)用(yong)。
