### 2018 年 12 月 9 日 發(fā)布
`5.1`版本的路由其實(shí)是完全重構(gòu)了,只是保留了和`5.0`幾乎一致的使用方法。詳細(xì)的用法官方手冊(cè)已經(jīng)說的非常詳細(xì)了,本文專門整理了`5.1`路由使用的一些注意事項(xiàng)和技巧,可以作為你學(xué)習(xí)的指引。
## 開啟路由
`5.1`版本的路由是默認(rèn)開啟的,而且不能關(guān)閉,對(duì)于不使用路由的模塊你不定義路由即可。
所有的路由規(guī)則是不支持普通URL參數(shù)的,必須是PATHINFO地址。
路由定義文件不一定是`route.php`,事實(shí)上可以是任何文件名,如果有必要,你可以使用不同的路由定義文件管理不同模塊的路由。
如果你開啟了路由強(qiáng)制模式,那么未定義的路由訪問將會(huì)拋出異常。
## 使用方法注冊(cè)路由規(guī)則
盡量使用路由類的方法注冊(cè)路由規(guī)則,數(shù)組配置定義路由規(guī)則的方式下一個(gè)版本已經(jīng)取消,不再建議使用,方法定義對(duì)于路由緩存的支持更好。
推薦使用:
```
Route::get('hello/:name', 'index/hello');
```
而不建議使用:
```
return [
'hello/:name' => 'index/hello',
];
```
## 明確定義請(qǐng)求類型
盡量明確定義路由的請(qǐng)求類型,提高路由解析的效率。
推薦使用:
```
Route::get('hello/:name', 'index/hello');
```
不建議使用:
```
Route::rule('hello/:name', 'index/hello');
```
## 不需要添加開頭斜線
除了首頁外,其它路由規(guī)則定義不需要添加開頭的斜線。
推薦使用:
```
Route::get('hello/:name', 'index/hello');
```
不建議使用:
```
Route::get('/hello/:name', 'index/hello');
```
除非是首頁路由
```
Route::get('/', 'index/index');
```
或者直接訪問分組名的情況
```
Route::group('blog', function() {
Route::get('/', 'index/blog');
Route::get(':id$', 'blog/read');
Route::get(':id/edit$', 'blog/edit');
});
```
## 多使用路由分組
可能的情況下,盡可能多使用路由分組??梢猿浞掷梅纸M的匹配機(jī)制提高路由解析性能。
推薦使用
```
Route::group('blog', function() {
Route::get(':id$', 'blog/read');
Route::get(':id/edit$', 'blog/edit');
});
```
不建議使用
```
Route::get('blog/:id$', 'blog/read');
Route::get('blog/:id/edit$', 'blog/edit');
```
## 路由分組傳入額外參數(shù)
可以統(tǒng)一給分組路由傳入額外的參數(shù)
```
Route::group('blog', [
':id' => 'Blog/read',
':name' => 'Blog/read',
])->ext('html')
->pattern(['id' => '\d+'])
->append(['group_id'=>1]);
```
上面的分組路由統(tǒng)一傳入了`group_id`參數(shù),該參數(shù)的值可以通過`Request`類的`param`方法獲取。
## 路由變量定義規(guī)范
對(duì)于新版的路由變量定義來說,不再區(qū)分普通變量和組合變量,哪怕你使用`:name`方式定義,內(nèi)部也會(huì)統(tǒng)一轉(zhuǎn)換成`<name>` 這種方式,因此為了提高路由解析性能,建議統(tǒng)一使用:
```
Route::group('blog', function() {
Route::get('<id>$', 'blog/read');
Route::get('<id>/edit$', 'blog/edit');
});
```
盡量明確定義路由變量的規(guī)則
```
Route::group('blog', function() {
Route::get('<id>$', 'blog/read');
Route::get('<id>/edit$', 'blog/edit');
})->pattern(['id' => '\d+']);
```
路由變量規(guī)則采用正則表達(dá)式方式定義,但無需在開頭添加^或者在最后添加$,也無需使用模式修飾符,系統(tǒng)會(huì)自動(dòng)添加。
不能使用`$_GET`方法或者Request類的`get`方法獲取路由變量,而應(yīng)該使用`param`方法或者參數(shù)綁定。
不同于`5.0`版本的變量匹配解析,`5.1`版本的路由變量是整體匹配解析的,因此性能不同。
如果開啟了路由合并解析的話,分組下面的多個(gè)路由規(guī)則是通過一次解析匹配完成的,如果路由規(guī)則較多性能會(huì)有大幅提升,具體可以參考這篇:[5.1.7新特性](https://blog.thinkphp.cn/784292)中的「路由改進(jìn)和提速」部分。
## 變量分隔符
你可以很隨意的使用路由變量分隔符,只要注意不要和你的變量規(guī)則沖突。
```
Route::get('item/<date><name>-<id>', 'product/item')
->pattern(['date'=>'\d{8}','name'=>'\w+','id'=>'\d+']);
```
## 默認(rèn)路由變量規(guī)則
默認(rèn)情況下,如果你沒有定義變量規(guī)則,則使用`\w+`作為變量規(guī)則
```
Route::get('hello/<name>', 'index/hello');
```
其實(shí)等同于
```
Route::get('hello/<name>', 'index/hello')->pattern([
'name' => '\w+',
]);
```
如果你希望改變默認(rèn)的路由變量規(guī)則,可以在應(yīng)用配置文件中設(shè)置
```
// 默認(rèn)的路由變量規(guī)則
'default_route_pattern' => '[a-z0-9\-\_\.]+',
```
路由變量規(guī)則的定義推薦使用`pattern`方法傳入數(shù)組的方式,下面的方式將來的版本將不再支持。
```
Route::get('hello/<name>', 'index/hello')->pattern('name','\w+');
```
## 路由完全匹配
默認(rèn)的路由規(guī)則只是匹配URL地址的開頭是否和定義的路由匹配
所以
```
Route::get('hello/:name', 'index/hello');
```
可以匹配下面的URL地址
```
hello/think
hello/think/thinkphp
hello/think/thinkphp/demo
```
但如果添加了路由完全匹配后
```
Route::get('hello/:name$', 'index/hello');
```
上面的三個(gè)URL地址中就只會(huì)匹配
```
hello/think
```
建議你開啟全局路由完全匹配
```
// 路由完全匹配
'route_complete_match' => true,
```
如果有個(gè)別路由仍然希望不要完全匹配,你可以使用
```
Route::get('hello/:name', 'index/hello')
->completeMatch(false);
```
關(guān)閉當(dāng)前路由規(guī)則(或者路由分組)的完整匹配。
## 定義路由標(biāo)識(shí)
路由標(biāo)識(shí)的作用只是用于URL地址生成,而且默認(rèn)會(huì)使用當(dāng)前的路由地址作為路由標(biāo)識(shí)。
```
Route::get('hello/:name', 'index/hello');
echo url('index/hello', ['name' => 'think']);
```
如果指定了路由標(biāo)識(shí)的話,url方法的用法就需要調(diào)整為:
```
Route::get('hello/:name', 'index/hello')->name('hello');
echo url('hello', ['name' => 'think']);
```
如果你希望簡(jiǎn)化URL地址的生成調(diào)用,可以在項(xiàng)目規(guī)范中強(qiáng)制統(tǒng)一規(guī)范,而不要使用URL地址這種默認(rèn)標(biāo)識(shí),使用路由標(biāo)識(shí)的優(yōu)勢(shì)是即使路由地址發(fā)生了變化,也無需改變url方法的代碼。
## 路由地址盡量不使用閉包定義
路由地址使用閉包的方式雖然有時(shí)候很方便,例如:
```
Route::get('hello/:name', function ($name) {
return 'Hello,' . $name;
});
```
但由于無法支持路由緩存,所以請(qǐng)謹(jǐn)慎使用。
## 用方法定義路由參數(shù)
出于語義化考慮,5.1版本的路由參數(shù)建議使用方法而不是參數(shù)。
推薦使用(支持IDE)
```
Route::get('new/:id', 'News/read')
->ext('html')
->https();
```
不建議使用:
```
Route::get('new/:id','News/read',['ext'=>'html','https'=>true]);
```
## 路由管理
路由定義可以按模塊分開多個(gè)文件管理,但最終都是會(huì)加載和進(jìn)行匹配,不要以為只會(huì)加載當(dāng)前模塊的,在路由解析完成之前,根本不知道當(dāng)前的模塊是什么。多個(gè)文件定義路由僅僅是為了讓你更方便管理而已。
如果你試圖用這種方式給不同模塊定義MISS路由,顯然是錯(cuò)誤的做法。
正確的姿勢(shì)是通過設(shè)置分組的MISS路由來給模塊定義。
## MISS路由
一旦你設(shè)置了全局的`MISS`路由,相當(dāng)于開啟了強(qiáng)制路由模式。
```
Route::miss('public/miss');
```
MISS路由可以針對(duì)不同路由分組(或者域名)設(shè)置,也可以針對(duì)不同的請(qǐng)求類型設(shè)置,
```
Route::group('blog', function() {
Route::get(':name$', 'blog/read');
...
Route::miss('blog/error','get');
Route::miss('blog/noAuth','post');
});
Route::group('user', function() {
Route::get(':id', 'user/info');
...
Route::miss('user/error');
});
```
## 路由綁定到模塊
你可以把某個(gè)域名(或者分組)綁定到模塊
```
Route::domain('blog', 'blog');
```
如果想在綁定模塊的同時(shí)定義一些特殊的路由規(guī)則,可以使用
```
Route::domain('blog', function () {
Route::rule(':id', 'index/blog/read');
Route::rule(user/':user', 'index/user/info');
})->bind('blog');
```
- 值得升級(jí)到5.1的18個(gè)理由
- 5.1.7版本新特性
- JSON字段類型在ORM中的使用
- 文件下載響應(yīng)對(duì)象
- 教你使用5.1的數(shù)組對(duì)象查詢
- 模型三大利器之一:搜索器
- 在ThinkPHP中使用Yaconf
- 掌握命令行的表格輸出
- 5.1.25查詢參數(shù)綁定的改進(jìn)
- ThinkPHP安全規(guī)范指引
- 巧用數(shù)據(jù)集的排序功能實(shí)現(xiàn)統(tǒng)計(jì)排序
- think-orm ——基于5.1的獨(dú)立ORM庫
- think-template——基于ThinkPHP的獨(dú)立模板引擎
- ThinkPHP5.1.26版本發(fā)布——修正版本,包含安全更新
- ThinkPHP5.0和3.2再發(fā)安全更新
- 官宣:ThinkPHP發(fā)布首個(gè)LTS版本
- 你真的了解Db類和模型的正確使用姿勢(shì)么?
- 如何更有效的記錄和管理日志
- 模型三大利器之二:修改器
- ThinkPHP5.1.28版本發(fā)布——修正上一版本問題,改進(jìn)關(guān)聯(lián)查詢
- 模型三大利器之三:獲取器
- API版本控制的幾種思路
- ThinkPHP5.2第一個(gè)Beta版本發(fā)布測(cè)試
- 讓你少犯錯(cuò)的數(shù)據(jù)查詢基本原則
- ThinkPHP發(fā)布5.1.29版本——常規(guī)更新
- 這15個(gè)好習(xí)慣讓你更容易升級(jí)到5.2
- 如何有效提高ThinkPHP的應(yīng)用性能
- 讓你提高開發(fā)效率的查詢技巧
- 模型關(guān)聯(lián)查詢不完全指南
- 5.2發(fā)布Beta2版本——統(tǒng)一和精簡(jiǎn)大量用法
- ThinkPHP發(fā)布5.1.30版本——支持微秒時(shí)間字段寫入
- ThinkPHP的數(shù)據(jù)緩存使用
- ThinkPHP5.2安裝及入口文件
- ThinkPHP榮獲2018 年度最受歡迎中國開源開發(fā)框架第1名
- 5.1路由使用心得技巧
- ThinkPHP5.*版本發(fā)布安全更新
- ThinkPHP項(xiàng)目及代碼規(guī)范指北
- 5.2版本的設(shè)計(jì)規(guī)范指導(dǎo)
- ThinkPHP5.1.32版本發(fā)布——圣誕快樂
- 利用Trait特性給模型增加樂觀鎖功能
- 5.2數(shù)據(jù)庫和模型的變化(摘要)
- ThinkPHP模板引擎實(shí)現(xiàn)和常見問題
- ThinkPHP5.0.24版本發(fā)布——安全更新
- 不忘初心,方得始終——ThinkPHP十三周年報(bào)告
- ThinkPHP5+相關(guān)資源匯總
- 異步社區(qū)ThinkPHP周年慶專享優(yōu)惠活動(dòng)
- 5.2路由的調(diào)整和改進(jìn)
- ThinkPHP發(fā)布5.1.33版本——包含安全更新
- ThinkPHP擴(kuò)展開發(fā)指南
- ThinkPHP發(fā)布5.2Beta3版本
- ThinkPHP發(fā)布5.1.34版本——喜迎新年
- ThinkPHP發(fā)布5.2RC1版本
- ThinkPHP發(fā)布5.1.35版本——常規(guī)更新
- 5.2配置類的調(diào)整
- 5.2時(shí)間查詢的改進(jìn)和優(yōu)化
- 5.2RC版本升級(jí)不完全指導(dǎo)(僅供學(xué)習(xí)參考)
- ThinkPHP5.2版本正式變更為6.0版本
- ThinkPHP百度云云虛擬主機(jī)專享免費(fèi)活動(dòng)
- 事件系統(tǒng)以及查詢事件、模型事件的使用
- ThinkPHP6.0RC2版本發(fā)布——架構(gòu)升級(jí)、精簡(jiǎn)核心
- ThinkPHP5.1.36LTS版本發(fā)布——常規(guī)更新
- 新版Session和Cookie設(shè)計(jì)變化
- ThinkPHP5.1.37版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC3版本發(fā)布——細(xì)節(jié)完善,體驗(yàn)優(yōu)化
- 6.0中間件使用詳解
- Composer各大廠商鏡像地址
- ThinkPHP6.0發(fā)布計(jì)劃公告
- 「ThinkPHP開發(fā)者周刊」招募志愿者
- ThinkPHP6.0日志變化
- ThinkPHP5.1.38版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC4版本發(fā)布——ORM獨(dú)立,日志多通道支持
- ThinkORM2.0開發(fā)指南上線
- ThinkPHP6.0RC5版本發(fā)布——多應(yīng)用模式獨(dú)立,中間件機(jī)制調(diào)整
- ThinkPHP6.0版本發(fā)布——程序員節(jié)福利
- ThinkPHP5.1.39LTS版本發(fā)布——常規(guī)更新
- ThinkPHP6.0.1版本發(fā)布——圣誕快樂!
- 回顧2019,展望2020!
- ThinkPHPV6.0.2版本發(fā)布——2020新春快樂!
- 周年福利系列:Swoole合作優(yōu)惠
- 億速云成為ThinkPHPV6.0獨(dú)家贊助發(fā)布商??
- 新冠疫情工具和限免資源專題(保持更新中)
- 周年福利系列:創(chuàng)宇信用認(rèn)證合作優(yōu)惠
- 周年福利系列:碼云企業(yè)版限時(shí)10%優(yōu)惠
- 周年福利系列:想天短說抵現(xiàn)優(yōu)惠
- think-swoole直播:從零開始掌握swoole開發(fā)
- 周年福利系列:B2C開源電商ShopXO授權(quán)8折優(yōu)惠
- 周年福利系列:LayuiAdmin 永久授權(quán)限時(shí)優(yōu)惠
- ThinkPHP資源導(dǎo)航站上線——構(gòu)建生態(tài) 服務(wù)未來
- ThinkPHP官方技術(shù)支持服務(wù)和應(yīng)用服務(wù)市場(chǎng)上線公測(cè)
- ThinkPHP市場(chǎng)精選——推廣基本要素
- ThinkPHP市場(chǎng)精選——客服聊天專題
- ThinkPHPV6.0.3版本發(fā)布——端午安康
- ThinkPHP開發(fā)者扶持計(jì)劃
- 6.0.3版本關(guān)鍵更新及升級(jí)事項(xiàng)
- 「ThinkPHP開發(fā)者周刊」改版重啟
- ThinkPHP市場(chǎng)精選——企業(yè)建站專題
- ThinkPHP 提供統(tǒng)一API接口服務(wù)
- ThinkPHP市場(chǎng)精選——直播電商專題
- ThinkAPI服務(wù)SDK發(fā)布
- 官方服務(wù)市場(chǎng)啟用獨(dú)立子域名
- ThinkPHP市場(chǎng)精選——刷臉支付專題
- ThinkAPI推出會(huì)員服務(wù)計(jì)劃
- ThinkPHPV6.0.4版本發(fā)布——中秋國慶雙節(jié)快樂
- ThinkPHPV5.1.40版本發(fā)布——常規(guī)更新
- 1024程序員節(jié)福利走一波
- ThinkPHP V6.0.5版本發(fā)布——兼容Composer2.0
- 知識(shí)圖譜應(yīng)用場(chǎng)景——源論技術(shù)沙龍
- ThinkPHP5.*版本改進(jìn)Composer2.0的兼容
- 官方市場(chǎng)雙十一精選推薦
- 技術(shù)人做產(chǎn)品有機(jī)會(huì)么(文末送課程)
- 本周秒殺——古德云售后獲客營銷系統(tǒng)
- ThinkAPI服務(wù)更新——支持接口分組和PHP版本依賴調(diào)整
- PHP8新特性盤點(diǎn)
- PHP8新特性系列:構(gòu)造器屬性提升使用及注意事項(xiàng)
- ThinkPHP2021新年寄語
- ThinkPHP V6.0.6&V5.1.41版本發(fā)布——兼容PHP8.0
- PHP如何更優(yōu)雅地調(diào)用API接口
- ThinkPHP V6.0.7發(fā)布——修正版本
- ThinkAPI服務(wù)更新——IP白名單
- 最新版ThinkORM對(duì)于時(shí)間字段的調(diào)整
- ThinkAPI短信接口正式上線
- ThinkPHP V6.0.8版本發(fā)布——多環(huán)境變量配置支持
- 頂想云寫作服務(wù)開啟第一次公測(cè)
- ThinkSSL上線——官方SSL/TLS證書服務(wù)
- MDBootstrap國內(nèi)用戶福利——ThinkPHP官方市場(chǎng)首發(fā)
- ThinkPHP V6.0.9版本發(fā)布——常規(guī)更新
- ThinkORM功能盤點(diǎn)——虛擬模型
- 全面支持主流GIT版本庫——云寫作服務(wù)第二次公測(cè)
- 云寫作服務(wù)私有化部署方案之:版本庫私有化
- 看云雙十一活動(dòng)
- ThinkPHP V6.0.10LTS發(fā)布——兼容PHP8.1
- ThinkPHP V6.0.12發(fā)布——命令行兼容8.1
- 頂想云知識(shí)管理上線公測(cè)——構(gòu)建企業(yè)文檔中心和知識(shí)庫
- 頂想云上線——助力生態(tài)數(shù)字化建設(shè)
- 618活動(dòng)進(jìn)行中——官方市場(chǎng)迎來一波更新
- 頂想云知識(shí)管理正式上線——看云文檔啟動(dòng)遷移服務(wù)
- ThinkPHP V6.0.13發(fā)布——常規(guī)更新
- 頂想云網(wǎng)站助理服務(wù)上線——構(gòu)建產(chǎn)品支持服務(wù)
- ThinkPHP發(fā)布6.1.0&6.0.14版本——安全更新
- ThinkPHP新版社區(qū)上線試運(yùn)營
- ThinkAPI上架人臉核身接口——助力網(wǎng)站實(shí)名認(rèn)證
- 辭舊迎新——舊版社區(qū)停止注冊(cè)及發(fā)帖
- ThinkPHP6.1.2版本發(fā)布——兼容PHP8.2
