路由參數
路由參數
路(lu)由(you)(you)參數是指可以設置(zhi)一些路(lu)由(you)(you)匹配(pei)的(de)(de)條(tiao)件(jian)參數,主要(yao)用(yong)于驗證當前(qian)的(de)(de)路(lu)由(you)(you)規(gui)則是否有效,主要(yao)包(bao)括(kuo):
| 參數 | 說明 |
|---|---|
| method | 請求類型檢測,支持多個請求類型 |
| ext | URL后綴檢測,支持匹配多個后綴 |
| deny_ext | URL禁止后綴檢測,支持匹配多個后綴 |
| https | 檢測是否https請求 |
| domain | 域名檢測 |
| before_behavior | 前置行為(檢測) |
| after_behavior | 后置行為(執行) |
| callback | 自定義檢測方法 |
| merge_extra_vars | 合并額外參數 |
| bind_model |
綁定模型(V5.0.1+) |
| cache |
請求緩存(V5.0.1+) |
| param_depr |
路由參數分隔符(V5.0.2+) |
| ajax |
Ajax檢測(V5.0.2+) |
| pjax |
Pjax檢測(V5.0.2+) |
V5.0.3+版本對ajax/pjax/https條件支持false。
這些路由參數(shu)可以混合使用,只要有(you)任何一條參數(shu)檢(jian)查(cha)不(bu)通(tong)過,當前路由就不(bu)會(hui)生效,繼續檢(jian)測后面(mian)的路由規則。
請求類型
如果指定請求類型注冊路由的話,無需設置method請求類型參數。如果使用了rule或者any方法注冊路由,或者使用路由配置定義文件的話,可以單獨使用method參數(shu)進(jin)行請求類型檢測。
使用方法:
// 檢測路由(you)規則僅GET請求有效(xiao)
Route::any('new/:id','News/read',['method'=>'get']);
// 檢測路由(you)規(gui)則僅GET和POST請求有效
Route::any('new/:id','News/read',['method'=>'get|post']);
URL后綴
// 定(ding)義(yi)GET請求(qiu)路由規(gui)則(ze) 并設置(zhi)URL后(hou)綴為(wei)html的時候有效
Route::get('new/:id','News/read',['ext'=>'html']);
支持匹(pi)配多個后(hou)綴,例(li)如:
Route::get('new/:id','News/read',['ext'=>'shtml|html']);
可(ke)以設置禁(jin)止訪問的URL后綴,例如:
// 定義GET請求路由規則 并設置禁止URL后綴為png、jpg和(he)gif的訪(fang)問
Route::get('new/:id','News/read',['deny_ext'=>'jpg|png|gif']);
V5.0.7版本以上,ext和deny_ext參數(shu)允許設(she)置為空,分(fen)別表示不允許任何后綴以(yi)及必須(xu)使用后綴訪問。
域名檢測
支持使(shi)用完整域名或者(zhe)子域名進行(xing)檢測(ce),例如:
// 完整域名檢(jian)測 只在news.thinkphp.cn訪問(wen)時路(lu)由有效(xiao)
Route::get('new/:id','News/read',['domain'=>'news.thinkphp.cn']);
// 子域(yu)名(ming)檢測
Route::get('new/:id','News/read',['domain'=>'news']);
HTTPS檢測
支持檢測當前是否HTTPS訪問(wen)
Route::get('new/:id','News/read',['https'=>true]);
前置行為檢測
支持使用行(xing)為(wei)對(dui)路由進行(xing)檢測是否匹配,如果行(xing)為(wei)方法(fa)返(fan)回false表示當前路由規則無效。
Route::get('user/:id','index/User/read',['before_behavior'=>'\app\index\behavior\UserCheck']);
行為(wei)類定(ding)義如下:
namespace app\index\behavior;
class UserCheck
{
public function run()
{
if('user/0'==request()->url()){
return false;
}
}
}
后置行為執行
可以為某個路由(you)或者(zhe)某個分組路由(you)定義(yi)后置行(xing)為執行(xing),表(biao)示當路由(you)匹配成功后,執行(xing)的行(xing)為,例如(ru):
Route::get('user/:id','User/read',['after_behavior'=>'\app\index\behavior\ReadInfo']);
其中(zhong)\app\index\behavior\ReadInit 行為類定義(yi)如下:
namespace app\index\behavior;
use app\index\model\User;
class ReadInfo {
public function run(){
$id = request()->route('id');
request()->user = User::get($id);
}
}
如果成功匹配到new/:id路由后,就會執(zhi)行(xing)行(xing)為類的(de)run方法,參數是(shi)路由地(di)址,可以動態改變。
Callback檢測
也可以支(zhi)持使(shi)用函數檢測路由,如(ru)果函數返(fan)回false則(ze)表(biao)示當前路由規則(ze)無效,例如(ru):
Route::get('new/:id','News/read',['callback'=>'my_check_fun']);
合并額外參數
通(tong)常用于(yu)完(wan)整(zheng)匹配的(de)情況,如果(guo)有額外的(de)參數則合并作為(wei)變量(liang)值,例如:
Route::get('new/:name$','News/read',['merge_extra_vars'=>true]);
會被匹配到,并且name變量的值為 thinkphp/hello。
配置文件中添加路由參數
如果使用配置文(wen)件(jian)的話(hua),可(ke)以使用:
return [
'blog/:id' => ['Blog/update',['method' => 'post','ext'=>'html|shtml']],
];
路由綁定模型(V5.0.1)
可以在當前路由(you)匹配后綁定模型(xing),后面則同(tong)過方(fang)法的對象自動注入(ru)來(lai)獲取。
Route::get('new/:name$','News/read',['bind_model'=>['User','name']]);
更多細節可以參考請(qing)求->依賴注入(ru)。
緩存路由請求
可以對當前的路由請求(qiu)進(jin)行緩存處(chu)理,例(li)如:
Route::get('new/:name$','News/read',['cache'=>3600]);
表示對當前(qian)路(lu)由(you)請求緩存3600秒(miao)。
