路由參數知多少



路由參數

#路由分組及規則定義支援指定路由參數,這些參數主要完成路由比對偵測以及後續行為。

路由參數可以在定義路由規則的時候直接傳入(批次),建議使用方法配置更加清晰。


Pjax偵測JSON偵測綁定驗證器類別進行資料驗證##追加額外的參數append
參數#方法名稱
extURL後綴偵測,支援符合多個後綴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
validateappend


middleware

#註冊路由中間件

middleware

filter
請求變數過濾

filter


用法範例:
Route::get('new/:id', 'News/read')
    ->ext('html')
    ->https();
Route::get('new/:id', 'News/read')
    ->option([
        'ext'   => 'html',
        'https' => true
    ]);
URL後綴不同參數設定的差異如下:#配置值##描述#false空字串
這些路由參數可以混合使用,只要有任何一條參數檢查不通過,目前路由就不會生效,繼續偵測後面的路由規則。 如果你需要批次設定路由參數,也可以使用option方法。
URL後綴如果是全域統一的話,可以在應用程式設定檔route.php中設定url_html_suffix參數,如果目前存取的URL位址中的URL後綴是允許的偽靜態後綴,那麼後綴本身是不會被當作參數值傳入的。
禁止偽靜態存取
允許任意偽靜態後綴################html##########只允許設定的偽靜態後綴########### #html|htm######允許多個偽靜態字尾############


// 定义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參數來進行權限檢查。