路由在框架中的做用打個比方的話,路由比如是WEB應用的總調度室,對於訪問的URL地址,路由能夠拒絕或者接受某個URL請求,並進行分發調度,並且還有一個反作用是由於路由規則能夠隨意定義,所以可讓你的URL請求地址更優雅,由於不會暴露實際的URL地址,也就意味着更安全,5.0的路由不只僅只是支持路由到控制器的操做方法,甚至能夠路由到任何的類或者閉包。php
一、路由模式thinkphp
路由能夠理解爲一種尋徑功能模塊,好比URL地址裏面的index模塊怎麼才能省略呢,默認的URL地址顯得有點長,下面就來講說如何經過路由簡化URL訪問。ThinkPHP5.0的路由比較靈活,而且不須要強制定義,能夠總結概括爲以下三種方式:安全
1.1、普通模式閉包
關閉路由,徹底使用默認的PATH_INFO方式URL:app
'url_route_on' => false,
路由關閉後,不會解析任何路由規則,採用默認的PATH_INFO 模式訪問URL:框架
http://serverName/index.php/module/controller/action/param/value/...
但仍然能夠經過操做方法的參數綁定、空控制器和空操做等特性實現URL地址的簡化。post
能夠設置url_param_type
配置參數來改變pathinfo模式下面的參數獲取方式,默認是按名稱成對解析,支持按照順序解析變量,只須要更改成:學習
// 按照順序解析變量 'url_param_type' => 1,
1.二、混合模式網站
開啓路由,並使用路由定義+默認PATH_INFO方式的混合:url
'url_route_on' => true, 'url_route_must'=> false,
該方式下面,只須要對須要定義路由規則的訪問地址定義路由規則,其它的仍然按照第一種普通模式的PATH_INFO模式訪問URL。
1.三、強制模式
開啓路由,並設置必須定義路由才能訪問:
'url_route_on' => true, 'url_route_must' => true,
這種方式下面必須嚴格給每個訪問地址定義路由規則(包括首頁),不然將拋出異常。
首頁的路由規則採用/
定義便可,例以下面把網站首頁路由輸出Hello,world!
Route::get('/',function(){ return 'Hello,world!'; });
二、路由配置
2.1、
URL請求的執行流程:用戶請求 -> 路由解析 -> 調度請求 -> 執行操做 -> 響應輸出
2.二、路由規則寫在哪裏:
* 路由規則寫在與應用配置統計的route.php文件中
* 路由規則主要使用路由類Route::rule()方法註冊
2.3、
設置路由配置文件列表:
'route_config_file' => ['home','admin'],
application/home.php
配置home
模塊的路由規則,application/admin.php
則配置admin
模塊的路由規則。
雖然運行的時候依然會同時加載並註冊,但定義的時候是明確分開了,便於協做。
三、路由註冊
路由註冊能夠採用方法動態單個和批量註冊,也能夠直接定義路由定義文件的方式進行集中註冊。
3.一、動態註冊和靜態路由
如今給該URL地址定義一個新的路由規則以下:
Route::rule('hello/:name','index/Index/hello');
如今咱們來分析下rule
方法的參數,第一個參數稱爲路由規則(經過路由訪問的地址),第二個參數爲該規則對應的路由地址(也就是原來定義路由以前訪問的URL地址)。
路由規則一般能夠包含變量(例如其中的:name
就是一個路由變量),路由規則中包含變量(包括可選變量)的就稱該條路由規則爲動態路由,沒有包含任何變量的路由咱們稱之爲靜態路由,例如:
// 靜態路由規則 Route::rule('hello','index/Index/hello'); // 動態路由規則 Route::rule('hello/:name','index/Index/hello');
注:ThinkPHP5.0的路由規則定義是從根目錄開始,而不是基於模塊名的。而且原來的訪問地址會自動失效。
3.二、URL請求類型
咱們知道一個URL請求類型有不少,經常使用的包括GET
/ POST
/ PUT
/ DELETE
等,咱們使用rule
方法註冊的路由,默認是支持任意請求類型訪問的,不過你能夠經過第三個參數來限定請求類型:
Route::rule('hello/:name','index/index/hello','GET');
注:只有經過GET
請求的訪問,該路由纔會生效。不指定的話默認爲任何請求類型
若是你但願路由能夠支持全部的請求類型,也可使用:
Route::any('hello/:name','index/index/hello');
注:any
方法其實和rule
方法是同樣的,區別在於不用寫第三個參數。
系統提供了爲不一樣的請求類型定義路由規則的簡化方法,例如:
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(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);
四、路由表達式
路由表達式統一使字符串定義,採用規則定義的方式。
4.一、規則表達式
規則表達式一般包含靜態地址和動態地址,或者兩種地址的結合,例以下面都屬於有效的規則表達式:
'/' => 'index', // 首頁訪問路由 'my' => 'Member/myinfo', // 靜態地址路由 'blog/:id' => 'Blog/read', // 靜態地址和動態地址結合 'new/:year/:month/:day'=>'News/read', // 靜態地址和動態地址結合 ':user/:blog_id'=>'Blog/read',// 全動態地址
每一個參數中以「:」開頭的參數都表示動態變量,而且會自動綁定到操做方法的對應參數。
4.二、路由變量
支持對路由參數的可選定義,例如:
'blog/:year/[:month]'=>'Blog/archive',
[:month]
變量用[ ]
包含起來後就表示該變量是路由匹配的可選變量。
4.三、變量解析方式
路由規則以外的變量解析方式通常是key1/value1/key2/value2
解析爲key1=value1
,key2=value2
,也就是說
http://tp5.com/hello/thinkphp/city/shanghai
除了會解析路由變量name
以外,還會解析另一個city
變量,分別是:
'name' => 'thinkphp', 'city' => 'shanghai'
固然咱們能夠設置按順序解析:
'url_param_type' => 1
這個時候若是訪問http://tp5.com/hello/thinkphp/city/shanghai,獲得的變量結果就徹底不一樣了:
'name' => 'thinkphp', 0 => 'city', 1 => 'shanghai',
4.四、定製分隔符
咱們在定義路由規則的時候,都是統一使用/
做爲URL分隔符,但並非表示URL訪問的時候只能使用/
做爲分隔符,例如咱們能夠設置參數:
'pathinfo_depr' => '-',
那麼URL訪問地址就會變成
http://tp5.com/hello-thinkphp http://tp5.com/hello-thinkphp-beijing
若是你但願某個路由地址使用不一樣的URL分隔符,有兩種方法:
方法一:param_depr
先介紹第一種比較簡單的,定義路由規則的時候,添加param_depr
參數(要求V5.0.2+
),例如:
Route::get('hello/:name/[:city]','index/index/hello',['param_depr' => '-'],[ 'name' => '\w+' , 'city' => '[A-Za-z]+' ]);
表示只有在該路由規則訪問的時候,才使用-
做爲url分隔符。
方法二:組合變量
在一些複雜的路由規則定義中,咱們可使用組合變量定義方式,組合變量的優點是變量分隔符能夠隨意定義,例如:
//正確路徑:http://www.mtp5.com/test/1;注:‘?《name?》’表示可選的,['index/index2/test', []]裏面的‘[]’是必須的 'test/<id?>-?<name?>' =>['index/index2/test', []] //正確路徑:http://www.mtp5.com/test-1 'test-<id>-?<name?>' =>['index/index2/test', []] //正確路徑:http://www.mtp5.com/test-1- 'test-<id>-<name?>' =>['index/index2/test', []] //正確路徑:http://www.mtp5.com/test/1- 'test/<id>-<name?>' =>['index/index2/test', []] //正確路徑:http://www.mtp5.com/test1 'test?<id?>-?<name?>' =>['index/index2/test', []] //正確路徑:http://www.mtp5.com/test 'test-?<id?>-?<name?>' =>['index/index2/test', []]
錯誤的寫法:
//錯誤寫法 'test/?<id?>-?<name?>' =>['index/index2/test', []] 'test/[:id]-?<name?>' =>['index/index2/test', []]
注:<name?>表示可選變量,'?<name?>'表示前面的分隔符和這個變量都是可選的
經過本篇內容的學習,你已經掌握了路由變量的使用,下面是路由變量的對比
變量定義 | 必須變量 | 可選變量 | 變量分隔符 |
---|---|---|---|
普通變量 | :name |
[:name] |
/ |
組合變量 | <name> |
<name?> |
實際URL分隔符 |
4.五、完整匹配
規則匹配檢測的時候只是對URL從頭開始匹配,只要URL地址包含了定義的路由規則就會匹配成功,若是但願徹底匹配,能夠在路由表達式最後使用$
符號,例如:
//正確的寫法
'new/:cate$'=> 'News/category',//路徑:http://serverName/index.php/new/info
'hello/[:name]$' => 'index/hello',
//錯誤的寫法'url/[:id]/[:name$]' => 'index/index2/url',