路由參數知多少
路由參數
#路由分組及規則定義支援指定路由參數,這些參數主要完成路由比對偵測以及後續行為。
路由參數可以在定義路由規則的時候直接傳入(批次),建議使用方法配置更加清晰。
參數 | #方法名稱 | |
---|---|---|
ext | URL後綴偵測,支援符合多個後綴 | ext |
deny_ext | URL禁止後綴檢測,支援匹配多個後綴 | denyExt |
#https | 檢測是否https請求 | https |
domain | 網域偵測 | domain |
#complete_match | 是否完整符合路由 | completeMatch |
model | 綁定模型 | model |
cache | #請求快取 | cache |
ajax | #Ajax偵測 | ajax |
##pjax | ||
pjax | #json | |
json | #validate | |
validate | append | ##追加額外的參數
filter
請求變數過濾
filter
這些路由參數可以混合使用,只要有任何一條參數檢查不通過,目前路由就不會生效,繼續偵測後面的路由規則。 | 如果你需要批次設定路由參數,也可以使用option方法。 |
---|---|
URL後綴如果是全域統一的話,可以在應用程式設定檔route.php中設定url_html_suffix參數,如果目前存取的URL位址中的URL後綴是允許的偽靜態後綴,那麼後綴本身是不會被當作參數值傳入的。 | 不同參數設定的差異如下:|
#配置值 | |
| #false |
禁止偽靜態存取 |
// 定义GET请求路由规则 并设置URL后缀为html的时候有效 Route::get('new/:id', 'News/read') ->ext('html');
支援符合多個後綴,例如:
Route::get('new/:id', 'News/read') ->ext('shtml|html');
如果ext方法不傳入任何值,表示不允許使用任何後綴存取。
可以設定禁止存取的URL後綴,例如:
// 定义GET请求路由规则 并设置禁止URL后缀为png、jpg和gif的访问 Route::get('new/:id', 'News/read') ->denyExt('jpg|png|gif');
如果denyExt方法不傳入任何值,表示必須使用後綴存取。
網域偵測
支援使用完整網域或子網域進行偵測,例如:
// 完整域名检测 只在news.thinkphp.cn访问时路由有效 Route::get('new/:id', 'News/read') ->domain('news.thinkphp.cn'); // 子域名检测 Route::get('new/:id', 'News/read') ->domain('news');
如果需要給子網域定義批次的路由規則,建議使用domain方法進行路由定義。
HTTPS偵測
支援偵測目前是否HTTPS存取
// 必须使用HTTPS访问 Route::get('new/:id', 'News/read') ->https();
AJAX/PJAX/JSON偵測
可以偵測目前是否為AJAX/PJAX/JSON請求。
// 必须是JSON请求访问 Route::get('new/:id', 'News/read') ->json();
請求變數偵測
可以在匹配路由位址之外,額外檢查請求變數是否匹配,只有指定的請求變數也一致的情況下才能匹配該路由。
// 检查type变量 Route::post('new/:id', 'News/save') ->filter('type', 1); // 检查多个请求变量 Route::post('new/:id', 'News/save') ->filter([ 'type' => 1,'status'=> 1 ]);
追加額外參數
可以在定義路由的時候隱式追加額外的參數,這些參數不會出現在URL位址中。
Route::get('blog/:id', 'Blog/read') ->append(['app_id' => 1, 'status' => 1]);
在路由請求的時候會同時傳入app_id和status兩個參數。
路由綁定模型
路由規則和分組支援綁定模型數據,例如:
Route::get('hello/:id', 'index/hello') ->model('id', '\app\index\model\User');
會自動給目前路由綁定 id為目前路由變數值的User模型資料。
如果你的模型綁定使用的是id作為查詢條件的話,還可以簡化成下面的方式
Route::get('hello/:id', 'index/hello') ->model('\app\index\model\User');
默認情況下,如果沒有查詢到模型數據,則會拋出異常,如果不希望拋出異常,可以使用
Route::rule('hello/:id', 'index/hello') ->model('id', '\app\index\model\User', false);
可以定義模型資料的查詢條件,例如:
Route::rule('hello/:name/:id', 'index/hello') ->model('id&name', '\app\index\model\User');
表示查詢id和name的值等於目前路由變數的模型資料。
也可以使用閉包來自訂傳回所需的模型物件
Route::rule('hello/:id', 'index/hello') ->model(function ($id) { $model = new \app\index\model\User; return $model->where('id', $id)->find(); });
閉包函數的參數就是目前請求的URL變數資訊。
綁定的模型可以直接在控制器的架構方法或操作方法中自動注入,具體可以參考請求章節的依賴注入。
請求快取
可以對目前的路由請求進行請求快取處理,例如:
Route::get('new/:name$', 'News/read') ->cache(3600);
表示對目前路由請求快取3600秒,更多內容可以參考請求快取一節。
路由中間件
可以使用路由中間件,註冊方式如下:
Route::rule('hello/:name','hello') ->middleware('Auth');
或對路由分組註冊中間件
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('Auth');
如果需要傳入額外參數給中間件,可以使用
Route::rule('hello/:name','hello') ->middleware('Auth:admin');
如果使用的是常數方式定義,可以在第二個參數傳入中間件參數。
Route::rule('hello/:name','hello') ->middleware(Auth::class, 'admin');
如果需要定義多個中間件,使用陣列方式
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']);
可以統一傳入同一個額外參數
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check'], 'admin');
或單獨指定中間件參數。
Route::rule('hello/:name','hello') ->middleware(['Auth:admin', 'Check:editor']);
動態參數
如果你需要額外自訂一些路由參數,可以使用下面的方式:
Route::get('new/:name$', 'News/read') ->option('rule','admin');
或使用動態方法
Route::get('new/:name$', 'News/read') ->rule('admin');
在後續的路由行為後可以呼叫該路由的rule參數來進行權限檢查。