路由分組技術



路由分組

#使用Route類別的group方法進行註冊,並為分組路由定義一些公用的路由設置參數,例如:

Route::group('blog', function () {
    Route::rule(':id', 'blog/read');
    Route::rule(':name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

分組路由支援所有的路由參數設置,特定參數的用法請參考路由參數章節內容。

如果只是用於對一些路由規則設定一些公共的路由參數(也稱之為虛擬分組),也可以使用:

Route::group(function () {
    Route::rule('blog/:id', 'blog/read');
    Route::rule('blog/:name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

路由分組支援嵌套,例如:

Route::group(function () {
    Route::group('blog', function () {
        Route::rule(':id', 'blog/read');
        Route::rule(':name', 'blog/read');
    });
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

如果使用了巢狀分組的情況,子分組會繼承父分組的參數和變數規則,而最終的路由規則裡面定義的參數和變數規則為最優先。

可以使用prefix方法簡化相同路由位址的定義,例如下面的定義

Route::group('blog', function () {
    Route::get(':id', 'blog/read');
    Route::post(':id', 'blog/update');
    Route::delete(':id', 'blog/delete');
})->ext('html')->pattern(['id' => '\d+']);

可以簡化為

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);

路由完全符合

如果希望某個分組下面的路由都採用完全匹配,可以使用

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->completeMatch()->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);

延遲路由解析

支持延遲路由解析,也就是說你定義的路由規則(主要是分組路由和網域路由規則)在載入路由定義檔的時候並沒有實際註冊,而是在匹配到路由分組或網域的情況下,才會實際進行註冊和解析,大大提高了路由註冊和解析的效能。

預設是關閉延遲路由解析的,你可以在路由設定檔中設定:

// 开启路由延迟解析
'url_lazy_route'         => true,

開啟延遲路由解析後,如果你需要產生路由反解URL,需要使用命令列指令

php think optimize:route

來產生路由快取解析。

透過路由分組或網域路由來定義路由才能發揮延遲解析的優勢。

一旦開啟路由的延遲解析,將會對定義的網域路由和分組路由進行延遲解析,也就是說只有實際匹配到該網域或分組後才會進行路由規則的註冊,避免不必要的註冊和解析開銷。

路由規則合併解析

同一個路由分組下的路由規則支援合併解析,而不需要遍歷該路由分組下的所有路由規則,可以大幅提升路由解析的效能。

對某個分組單獨開啟合併規則解析的用法如下:

Route::group('user', function () {
    Route::rule('hello/:name','hello');
    Route::rule('think/:name','think');
})->mergeRuleRegex();

這樣該分組下的所有路由規則無論定義多少個都只需要匹配檢查一次即可(實際上只會合併檢查符合目前請求類型的路由規則)。

mergeRuleRegex方法只能用於路由分組或網域路由(網域路由其實是特殊的分組)。

或在路由設定檔中設定開啟全域合併規則(對所有分組有效)

// 开启路由合并解析
'route_rule_merge'	=> true,

傳入額外參數

##可以統一給分組路由傳入額外的參數

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->ext('html')
->pattern(['id' => '\d+'])
->append(['group_id' => 1]);

上面的分組路由統一傳入了group_id參數,該參數的值可以透過Request類別的param方法取得。