## 定義路由
URL地址里面的`index`模塊怎么才能省略呢,默認(rèn)的URL地址顯得有點(diǎn)長(zhǎng),下面就來(lái)說(shuō)說(shuō)如何通過(guò)路由簡(jiǎn)化URL訪問(wèn)。
我們?cè)诼酚啥x文件(`application/route.php`)里面添加一些路由規(guī)則,如下:
~~~
return [
// 添加路由規(guī)則 路由到 index控制器的hello操作方法
'hello/:name' => 'index/index/hello',
];
~~~
該路由規(guī)則表示所有`hello`開(kāi)頭的并且?guī)?shù)的訪問(wèn)都會(huì)路由到`index`控制器的`hello`操作方法。
路由之前的URL訪問(wèn)地址為:
~~~
http://tp5.com/index/index/hello/name/thinkphp
~~~
定義路由后就只能訪問(wèn)下面的URL地址
~~~
http://tp5.com/hello/thinkphp
~~~
>[danger] #### 注意
>****
> 定義路由規(guī)則后,原來(lái)的URL地址將會(huì)失效,變成非法請(qǐng)求。

但這里有一個(gè)小問(wèn)題,如果我們只是訪問(wèn)
~~~
http://tp5.com/hello
~~~
將發(fā)生錯(cuò)誤,

事實(shí)上這是由于路由沒(méi)有正確匹配到,我們修改路由規(guī)則如下:
~~~
return [
// 路由參數(shù)name為可選
'hello/[:name]' => 'index/hello',
];
~~~
使用`[]`把路由規(guī)則中的變量包起來(lái),就表示該變量為可選,接下來(lái)就可以正常訪問(wèn)了。
~~~
http://tp5.com/hello
~~~
當(dāng)`name`參數(shù)沒(méi)有傳入值的時(shí)候,`hello`方法的`name`參數(shù)有默認(rèn)值`World`,所以輸出的內(nèi)容為 `Hello,World!`
除了路由配置文件中定義之外,還可以采用動(dòng)態(tài)定義路由規(guī)則的方式定義,例如在路由配置文件(`application/route.php`)的開(kāi)頭直接添加下面的方法:
~~~
use think\Route;
Route::rule('hello/:name', 'index/hello');
~~~
完成的效果和使用配置方式定義是一樣的。
無(wú)論是配置方式還是通過(guò)Route類的方法定義路由,都統(tǒng)一放到路由配置文件`application/route.php`文件中,具體原因后面會(huì)揭曉。
>[success]#### 提示:
> * * * * *
>注意路由配置不支持在模塊配置文件中設(shè)置。
### 完整匹配
前面定義的路由是只要以hello開(kāi)頭就能進(jìn)行匹配,如果需要完整匹配,可以使用下面的定義:
~~~
return [
// 路由參數(shù)name為可選
'hello/[:name]$' => 'index/hello',
];
~~~
當(dāng)路由規(guī)則以`$`結(jié)尾的時(shí)候就表示當(dāng)前路由規(guī)則需要完整匹配。
當(dāng)我們?cè)L問(wèn)下面的URL地址的時(shí)候:
~~~
http://tp5.com/hello // 正確匹配
http://tp5.com/hello/thinkphp // 正確匹配
http://tp5.com/hello/thinkphp/val/value // 不會(huì)匹配
~~~
### 閉包定義
還支持通過(guò)定義閉包為某些特殊的場(chǎng)景定義路由規(guī)則,例如:
~~~
return [
// 定義閉包
'hello/[:name]' => function ($name) {
return 'Hello,' . $name . '!';
},
];
~~~
或者
~~~
use think\Route;
Route::rule('hello/:name', function ($name) {
return 'Hello,' . $name . '!';
});
~~~
>[success]#### 提示:
> * * * * *
> 閉包函數(shù)的參數(shù)就是路由規(guī)則中定義的變量。
因此,當(dāng)訪問(wèn)下面的URL地址:
~~~
http://tp5.com/hello/thinkphp
~~~
會(huì)輸出
~~~
Hello,thinkphp!
~~~
### 設(shè)置URL分隔符
如果需要改變URL地址中的`pathinfo`參數(shù)分隔符,只需要在應(yīng)用配置文件(`application/config.php`)中設(shè)置:
~~~
// 設(shè)置pathinfo分隔符
'pathinfo_depr' => '-',
~~~
路由規(guī)則定義無(wú)需做任何改變,我們就可以訪問(wèn)下面的地址:
~~~
http://tp5.com/hello-thinkphp
~~~
### 路由參數(shù)
我們還可以約束路由規(guī)則的請(qǐng)求類型或者URL后綴之類的條件,例如:
~~~
return [
// 定義路由的請(qǐng)求類型和后綴
'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],
];
~~~
上面定義的路由規(guī)則限制了必須是`get`請(qǐng)求,而且后綴必須是`html`的,所以下面的訪問(wèn)地址:
~~~
http://tp5.com/hello // 無(wú)效
http://tp5.com/hello.html // 有效
http://tp5.com/hello/thinkphp // 無(wú)效
http://tp5.com/hello/thinkphp.html // 有效
~~~
> 更多的路由參數(shù)請(qǐng)參考完全開(kāi)發(fā)手冊(cè)的路由參數(shù)一節(jié)。
### 變量規(guī)則
接下來(lái),我們來(lái)嘗試一些復(fù)雜的路由規(guī)則定義滿足不同的路由變量。在此之前,首先增加一個(gè)控制器類如下:
~~~
<?php
namespace app\index\controller;
class Blog
{
public function get($id)
{
return '查看id=' . $id . '的內(nèi)容';
}
public function read($name)
{
return '查看name=' . $name . '的內(nèi)容';
}
public function archive($year, $month)
{
return '查看' . $year . '/' . $month . '的歸檔內(nèi)容';
}
}
~~~
添加如下路由規(guī)則:
~~~
return [
'blog/:year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],
'blog/:id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']],
'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],
];
~~~
在上面的路由規(guī)則中,我們對(duì)變量進(jìn)行的規(guī)則約束,變量規(guī)則使用正則表達(dá)式進(jìn)行定義。
我們看下幾種URL訪問(wèn)的情況
~~~
// 訪問(wèn)id為5的內(nèi)容
http://tp5.com/blog/5
// 訪問(wèn)name為thinkphp的內(nèi)容
http://tp5.com/blog/thinkphp
// 訪問(wèn)2015年5月的歸檔內(nèi)容
http://tp5.com/blog/2015/05
~~~
### 路由分組
上面的三個(gè)路由規(guī)則由于都是`blog`打頭,所以我們可以做如下的簡(jiǎn)化:
~~~
return [
'[blog]' => [
':year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],
':id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']],
':name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],
],
];
~~~
對(duì)于這種定義方式,我們稱之為路由分組,路由分組一定程度上可以提高路由檢測(cè)的效率。
### 復(fù)雜路由
有時(shí)候,我們還需要對(duì)URL做一些特殊的定制,例如如果要同時(shí)支持下面的訪問(wèn)地址
~~~
http://tp5.com/blog/thinkphp
http://tp5.com/blog-2015-05
~~~
我們只要稍微改變路由定義規(guī)則即可:
~~~
return [
'blog/:id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']],
'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],
'blog-<year>-<month>' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],
];
~~~
對(duì) `blog-<year>-<month>` 這樣的非正常規(guī)范,我們需要使用`<變量名>`這樣的變量定義方式,而不是 `:變量名`方式。
簡(jiǎn)單起見(jiàn),我們還可以把變量規(guī)則統(tǒng)一定義,例如:
~~~
return [
// 全局變量規(guī)則定義
'__pattern__' => [
'name' => '\w+',
'id' => '\d+',
'year' => '\d{4}',
'month' => '\d{2}',
],
// 路由規(guī)則定義
'blog/:id' => 'blog/get',
'blog/:name' => 'blog/read',
'blog-<year>-<month>' => 'blog/archive',
];
~~~
在`__pattern__`中定義的變量規(guī)則我們稱之為全局變量規(guī)則,在路由規(guī)則里面定義的變量規(guī)則我們稱之為局部變量規(guī)則,如果一個(gè)變量同時(shí)定義了全局規(guī)則和局部規(guī)則的話,當(dāng)前的局部規(guī)則會(huì)覆蓋全局規(guī)則的,例如:
~~~
return [
// 全局變量規(guī)則
'__pattern__' => [
'name' => '\w+',
'id' => '\d+',
'year' => '\d{4}',
'month' => '\d{2}',
],
'blog/:id' => 'blog/get',
// 定義了局部變量規(guī)則
'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w{5,}']],
'blog-<year>-<month>' => 'blog/archive',
];
~~~
>[danger]### 【 5.1 】使用須知
> * * * * *
> 5.1的路由配置文件改為`route/route.php`,并且支持隨意命名,都會(huì)自動(dòng)加載。并盡量使用方法注冊(cè)路由的方式替代數(shù)組配置的方式,例如。
>
~~~
use think\facade\Route;
Route::get('blog/:id','blog/get');
Route::get('blog/:name','blog/read');
~~~
- 零、序言
- 一、基礎(chǔ)
- (1)簡(jiǎn)介
- (2)安裝
- (3)目錄結(jié)構(gòu)
- (4)運(yùn)行環(huán)境
- (5)入口文件
- (6)資源訪問(wèn)
- (7)調(diào)試模式
- (8)控制器
- (9)視圖
- (10)讀取數(shù)據(jù)
- (11)總結(jié)
- 二、URL和路由
- (1)URL訪問(wèn)
- (2)參數(shù)傳入
- (3)隱藏入口
- (4)定義路由
- (5)URL生成
- (6)總結(jié)
- 三、請(qǐng)求和響應(yīng)
- (1)請(qǐng)求對(duì)象
- (2)請(qǐng)求信息
- (3)響應(yīng)對(duì)象
- (4)總結(jié)
- 四、數(shù)據(jù)庫(kù)
- (1)準(zhǔn)備
- (2)數(shù)據(jù)庫(kù)配置
- (3)原生查詢
- (4)查詢構(gòu)造器
- (5)鏈?zhǔn)讲僮?/a>
- (6)事務(wù)支持
- 五、查詢語(yǔ)言
- (1)查詢表達(dá)式
- (2)批量查詢
- (3)快捷查詢
- (4)視圖查詢
- (5)閉包查詢
- (6)獲取值和列
- (7)聚合查詢
- (8)時(shí)間查詢
- (9)字符串查詢
- (10)分塊查詢
- 六、模型和關(guān)聯(lián)
- (1)模型定義
- (2)基礎(chǔ)操作
- (3)讀取器和修改器
- (4)類型轉(zhuǎn)換和自動(dòng)完成
- (5)查詢范圍
- (6)輸入和驗(yàn)證
- (7)關(guān)聯(lián)
- (8)模型輸出
- 七、視圖和模板
- (1)模板輸出
- (2)分頁(yè)輸出
- (3)公共模板
- (4)模板定位
- (5)布局模板
- (6)標(biāo)簽定制
- (7)輸出替換
- (8)渲染內(nèi)容
- (9)助手函數(shù)
- 八、調(diào)試和日志
- (1)第一式:未雨綢繆——頁(yè)面Trace
- (2)第二式:初見(jiàn)端倪——異常頁(yè)面
- (3)第三式:撥云見(jiàn)日——斷點(diǎn)調(diào)試
- (4)第四式:欲窮千里——日志分析
- (5)第五式:運(yùn)籌帷幄——遠(yuǎn)程調(diào)試
- 九、API開(kāi)發(fā)
- (1)API版本
- (2)異常處理
- (3)RESTFul
- (4)REST調(diào)試
- (5)API調(diào)試
- (6)安全建議
- 十、命令行工具
- (1)查看指令
- (2)模塊生成
- (3)控制器生成
- (4)生成類庫(kù)映射文件
- (5)生成路由緩存
- (6)生成字段緩存
- (7)指令擴(kuò)展
- (8)命令行調(diào)試
- (9)命令行顏色支持
- (10)命令調(diào)用
- 十一、擴(kuò)展
- (1)函數(shù)擴(kuò)展
- (2)類庫(kù)擴(kuò)展
- (3)驅(qū)動(dòng)擴(kuò)展
- (4)Composer擴(kuò)展
- 十二、雜項(xiàng)
- Session
- Cookie
- 驗(yàn)證碼
- 文件上傳
- 圖像處理
- 單元測(cè)試
- 番外篇:學(xué)習(xí)ThinkPHP5的正確姿勢(shì)
- 概念篇:ThinkPHP5名詞解釋
- 附錄A、常見(jiàn)問(wèn)題集
- 附錄B、3.2和5.0區(qū)別
- 附錄C、助手函數(shù)
- 附錄D、5.1你必須努力避免的一些問(wèn)題