Thinkphp學習之路由定義 偽靜態規則(總結分享)

2022-04-14 16:00:34
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於路由定義以及偽靜態規則的相關問題,下面一起來看一下,希望對大家有幫助。

推薦學習:《》

Thinkphp 6.0路由定義 偽靜態規則

要使用Route類註冊路由必須首先在路由定義檔案開頭新增參照(後面不再重複說明)

use think\facade\Route;

註冊路由

最基礎的路由定義方法是:

Route::rule('路由表示式', '路由地址', '請求型別');

例如註冊如下路由規則(假設為單應用模式):

// 註冊路由到News控制器的read操作
Route::rule('new/:id','News/read');

我們存取:

http://serverName/new/5

會自動路由到:

http://serverName/news/read/id/5

並且原來的存取地址會自動失效。

可以在rule方法中指定請求型別(不指定的話預設為任何請求型別有效),例如:

Route::rule('new/:id', 'News/update', 'POST');

請求型別引數不區分大小寫。

表示定義的路由規則在POST請求下才有效。如果要定義GETPOST請求支援的路由規則,可以用:

Route::rule('new/:id','News/read','GET|POST');

不過通常我們更推薦使用對應請求型別的快捷方法,包括:

型別描述快捷方法
GETGET請求get
POSTPOST請求post
PUTPUT請求put
DELETEDELETE請求delete
PATCHPATCH請求patch
*任何請求型別any

快捷註冊方法的用法為:

Route::快捷方法名('路由表示式', '路由地址');

使用範例如下:

Route::get('new/<id>','News/read'); // 定義GET請求路由規則
Route::post('new/<id>','News/update'); // 定義POST請求路由規則
Route::put('new/:id','News/update'); // 定義PUT請求路由規則
Route::delete('new/:id','News/delete'); // 定義DELETE請求路由規則
Route::any('new/:id','News/read'); // 所有請求都支援的路由規則

註冊多個路由規則後,系統會依次遍歷註冊過的滿足請求型別的路由規則,一旦匹配到正確的路由規則後則開始執行最終的排程方法,後續規則就不再檢測。

規則表示式

規則表示式通常包含靜態規則和動態規則,以及兩種規則的結合,例如下面都屬於有效的規則表示式:

Route::rule('/', 'index'); // 首頁存取路由
Route::rule('my', 'Member/myinfo'); // 靜態地址路由
Route::rule('blog/:id', 'Blog/read'); // 靜態地址和動態地址結合
Route::rule('new/:year/:month/:day', 'News/read'); // 靜態地址和動態地址結合
Route::rule(':user/:blog_id', 'Blog/read'); // 全動態地址

規則表示式的定義以/為引數分割符(無論你的PATH_INFO分隔符設定是什麼,請確保在定義路由規則表示式的時候統一使用/進行URL引數分割,除非是使用組合變數的情況)。

每個引數中可以包括動態變數,例如:變數或者<變數>都表示動態變數(新版推薦使用第二種方式,更利於混合變數定義),並且會自動繫結到操作方法的對應引數。

你的URL存取PATH_INFO分隔符使用pathinfo_depr設定,但無論如何設定,都不影響路由的規則表示式的路由分隔符定義。

可選變數

支援對路由引數的可選定義,例如:

Route::get('blog/:year/[:month]','Blog/archive');
// 或者
Route::get('blog/<year>/<month?>','Blog/archive');

變數用[ ]包含起來後就表示該變數是路由匹配的可選變數。

以上定義路由規則後,下面的URL存取地址都可以被正確的路由匹配:

http://serverName/index.php/blog/2015
http://serverName/index.php/blog/2015/12

採用可選變數定義後,之前需要定義兩個或者多個路由規則才能處理的情況可以合併為一個路由規則。

可選引數只能放到路由規則的最後,如果在中間使用了可選引數的話,後面的變數都會變成可選引數。

完全匹配

規則匹配檢測的時候預設只是對URL從頭開始匹配,只要URL地址開頭包含了定義的路由規則就會匹配成功,如果希望URL進行完全匹配,可以在路由表示式最後使用$符號,例如:

Route::get('new/:cate$', 'News/category');

這樣定義後

http://serverName/index.php/new/info

會匹配成功,而

http://serverName/index.php/new/info/2

則不會匹配成功。

如果是採用

Route::get('new/:cate', 'News/category');

方式定義的話,則兩種方式的URL存取都可以匹配成功。

如果需要全域性進行URL完全匹配,可以在路由組態檔中設定

// 開啟路由完全匹配
'route_complete_match'   => true,

開啟全域性完全匹配後,如果需要對某個路由關閉完全匹配,可以使用

Route::get('new/:cate', 'News/category')->completeMatch(false);

額外引數

在路由跳轉的時候支援額外傳入引數對(額外引數指的是不在URL裡面的引數,隱式傳入需要的操作中,有時候能夠起到一定的安全防護作用,後面我們會提到)。例如:

Route::get('blog/:id','blog/read')
    ->append(['status' => 1, 'app_id' =>5]);

上面的路由規則定義中statusapp_id引數都是URL裡面不存在的,屬於隱式傳值。可以針對不同的路由設定不同的額外引數。

如果append方法中的變數和路由規則存在衝突的話,append方法傳入的優先。

路由標識

如果你需要快速的根據路由生成URL地址,可以在定義路由的時候指定生成標識(但要確保唯一)。

例如

// 註冊路由到News控制器的read操作
Route::rule('new/:id','News/read')
    ->name('new_read');

生成路由地址的時候就可以使用

url('new_read', ['id' => 10]);

如果不定義路由標識的話,系統會預設使用路由地址作為路由標識,例如可以使用下面的方式生成

url('News/read', ['id' => 10]);

強制路由

在路由組態檔中設定

'url_route_must'		=>  true,

將開啟強制使用路由,這種方式下面必須嚴格給每一個存取地址定義路由規則(包括首頁),否則將丟擲異常。

首頁的路由規則採用/定義即可,例如下面把網站首頁路由輸出Hello,world!

Route::get('/', function () {
    return 'Hello,world!';
});

推薦學習:《》

以上就是Thinkphp學習之路由定義 偽靜態規則(總結分享)的詳細內容,更多請關注TW511.COM其它相關文章!