新版的路由經過重新設計,功能大為增強,主要特性有:
## 動態注冊路由
除了在路由配置文件中定義,現在可以通過\Think\Route類的靜態方法注冊路由。
最關鍵的方法是register方法,用法如下:
~~~
// 除了路由規則和路由地址外,其他都是可選
\Think\Route::register('路由規則','路由地址'[,'請求類型','路由參數','變量規則']);
~~~
如果沒有傳入請求類型的話,默認的是任何請求類型都有效,可以指定其他請求類型:
~~~
\Think\Route::register('new/:id','New/update','POST');
~~~
如果要定義get和post請求支持的路由規則,也可以用:
~~~
\Think\Route::register('new/:id','New/read','GET|POST');
~~~
請求類型包括:
|類型|描述|
|---|---|
|GET| 表示GET請求|
|POST| 表示POST請求|
|PUT| 表示PUT請求|
|DELETE |表示DELETE請求|
|* |表示任何請求類型|
系統提供了不同的請求類型簡化方法,例如:
~~~
// 定義GET請求路由規則
\Think\Route::get('路由規則','路由地址','路由參數','變量規則');
// 定義POST請求路由規則
\Think\Route::post('路由規則','路由地址','路由參數','變量規則');
// 定義PUT請求路由規則
\Think\Route::put('路由規則','路由地址','路由參數','變量規則');
// 定義DELETE請求路由規則
\Think\Route::delete('路由規則','路由地址','路由參數','變量規則');
// 所有請求都支持的路由規則
\Think\Route::any('路由規則','路由地址','路由參數','變量規則');
~~~
例如:
~~~
\Think\Route::get('new/:id','New/read'); // 定義GET請求路由規則
\Think\Route::post('new/:id','New/update'); // 定義POST請求路由規則
\Think\Route::put('new/:id','New/update'); // 定義PUT請求路由規則
\Think\Route::delete('new/:id','New/delete'); // 定義DELETE請求路由規則
\Think\Route::any('new/:id','New/read'); // 所有請求都支持的路由規則
~~~
## 閉包路由的增強
閉包路由可以進行路由劫持或者中斷處理,如果返回的是一個數組,那么表示路由到數組表示的模塊、控制器和操作繼續進行,例如:
~~~
\Think\Route::get('new/:id',function($id){
// 這里進行必要的處理
// 返回路由信息
return ['index','new','read'];
}); // 定義GET請求路由規則
~~~
> 如果直接輸出或者返回字符串變量的話,閉包方法執行后會終止執行后續的操作。
## 路由參數
路由參數主要用于驗證當前的路由規則是否有效,支持請求類型(method)、URL后綴(ext)、HTTPS請求(https)以及自定義檢測機制(callback),使用方法:
~~~
// 定義GET請求路由規則 并設置URL后綴為html的時候有效
\Think\Route::get('new/:id','New/read',['ext'=>'html']);
~~~
## 變量規則
ThinkPHP5.0支持在規則路由中為變量用正則的方式指定變量規則,彌補了之前變量規則太局限的問題,并且支持全局規則設置。使用方式如下:
設置全局變量規則,全局路由有效:
~~~
// 設置name變量的正則規則
\Think\Route::pattern('name','\w+');
// 支持批量添加
\Think\Route::pattern(['name'=>'\w+','id'=>'\d+']);
~~~
局部變量規則,僅在當前路由有效:
~~~
// 定義GET請求路由規則 并設置name變量規則
\Think\Route::get('new/:id','New/read',[],['name'=>'\w+']);
~~~
如果一個變量同時定義了全局規則和局部規則,局部規則會覆蓋全局變量的定義。
## 域名路由
可以給(子)域名或者IP指定路由規則,例如:
~~~
// blog.thinkphp.cn 路由到index模塊的blog控制器
\Think\Route::domain('blog.thinkphp.cn','index/blog');
// admin.thinkphp.cn 路由到admin模塊
\Think\Route::domain('admin.thinkphp.cn','admin');
~~~
## 路由分組
路由定義多了之后效率會變低,這個時候可以使用路由分組功能,把相同前綴的路由規則定義到一個分組,并且為分組定義相同的路由參數。
~~~
\Think\Route::group('new',[':id'=>'New/read',':name'=>'New/read'],'GET',['ext'=>'html'],['name'=>'\w+','id'=>'\d+']);
// 相當于同時注冊以下路由
\Think\Route::register('new/:id','New/read','GET',['ext'=>'html'],['id'=>'\d+']);
\Think\Route::register('new/:name','New/read','GET',['ext'=>'html'],['name'=>'\w+']);
~~~