路由定義
注冊路由規(guī)則
路由注冊可以采用方法動態(tài)單個(gè)和批量注冊,也可以直接定義路由定義文件的方式進(jìn)行集中注冊。
動態(tài)注冊
路由定義采用\think\Route
類的rule
方法注冊,通常是在應(yīng)用的路由配置文件application/route.php
進(jìn)行注冊,格式是:
Route::rule('路由表達(dá)式','路由地址','請求類型','路由參數(shù)(數(shù)組)','變量規(guī)則(數(shù)組)');
例如注冊如下路由規(guī)則:
use think\Route;
// 注冊路由到index模塊的News控制器的read操作
Route::rule('new/:id','index/News/read');
我們訪問:
http://serverName/new/5
ThinkPHP5.0的路由規(guī)則定義是從根目錄開始,而不是基于模塊名的。
會自動路由到:
http://serverName/index/news/read/id/5
并且原來的訪問地址會自動失效。
路由表達(dá)式(第一個(gè)參數(shù))支持定義命名標(biāo)識,例如:
// 定義new路由命名標(biāo)識
Route::rule(['new','new/:id'],'index/News/read');
注意,路由命名標(biāo)識必須唯一,定義后可以用于URL的快速生成。
可以在rule方法中指定請求類型,不指定的話默認(rèn)為任何請求類型,例如:
Route::rule('new/:id','News/update','POST');
表示定義的路由規(guī)則在POST請求下才有效。
請求類型包括:
類型 | 描述 |
---|---|
GET | GET請求 |
POST | POST請求 |
PUT | PUT請求 |
DELETE | DELETE請求 |
* | 任何請求類型 |
注意:請求類型參數(shù)必須大寫。
系統(tǒng)提供了為不同的請求類型定義路由規(guī)則的簡化方法,例如:
Route::get('new/:id','News/read'); // 定義GET請求路由規(guī)則
Route::post('new/:id','News/update'); // 定義POST請求路由規(guī)則
Route::put('new/:id','News/update'); // 定義PUT請求路由規(guī)則
Route::delete('new/:id','News/delete'); // 定義DELETE請求路由規(guī)則
Route::any('new/:id','News/read'); // 所有請求都支持的路由規(guī)則
如果要定義get和post請求支持的路由規(guī)則,也可以用:
Route::rule('new/:id','News/read','GET|POST');
我們也可以批量注冊路由規(guī)則,例如:
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']);
注冊多個(gè)路由規(guī)則后,系統(tǒng)會依次遍歷注冊過的滿足請求類型的路由規(guī)則,一旦匹配到正確的路由規(guī)則后則開始調(diào)用控制器的操作方法,后續(xù)規(guī)則就不再檢測。
路由表達(dá)式
路由表達(dá)式統(tǒng)一使字符串定義,采用規(guī)則定義的方式。
正則路由定義功能已經(jīng)廢除,改由變量規(guī)則定義完成。
規(guī)則表達(dá)式
規(guī)則表達(dá)式通常包含靜態(tài)地址和動態(tài)地址,或者兩種地址的結(jié)合,例如下面都屬于有效的規(guī)則表達(dá)式:
'/' => 'index', // 首頁訪問路由
'my' => 'Member/myinfo', // 靜態(tài)地址路由
'blog/:id' => 'Blog/read', // 靜態(tài)地址和動態(tài)地址結(jié)合
'new/:year/:month/:day'=>'News/read', // 靜態(tài)地址和動態(tài)地址結(jié)合
':user/:blog_id'=>'Blog/read',// 全動態(tài)地址
規(guī)則表達(dá)式的定義以/
為參數(shù)分割符(無論你的PATH_INFO分隔符設(shè)置是什么,請確保在定義路由規(guī)則表達(dá)式的時(shí)候統(tǒng)一使用/
進(jìn)行URL參數(shù)分割)。
每個(gè)參數(shù)中以“:”開頭的參數(shù)都表示動態(tài)變量,并且會自動綁定到操作方法的對應(yīng)參數(shù)。
可選定義
支持對路由參數(shù)的可選定義,例如:
'blog/:year/[:month]'=>'Blog/archive',
[:month]
變量用[ ]
包含起來后就表示該變量是路由匹配的可選變量。
以上定義路由規(guī)則后,下面的URL訪問地址都可以被正確的路由匹配:
http://serverName/index.php/blog/2015
http://serverName/index.php/blog/2015/12
采用可選變量定義后,之前需要定義兩個(gè)或者多個(gè)路由規(guī)則才能處理的情況可以合并為一個(gè)路由規(guī)則。
可選參數(shù)只能放到路由規(guī)則的最后,如果在中間使用了可選參數(shù)的話,后面的變量都會變成可選參數(shù)。
完全匹配
規(guī)則匹配檢測的時(shí)候只是對URL從頭開始匹配,只要URL地址包含了定義的路由規(guī)則就會匹配成功,如果希望完全匹配,可以在路由表達(dá)式最后使用$
符號,例如:
'new/:cate$'=> 'News/category',
http://serverName/index.php/new/info
會匹配成功,而
http://serverName/index.php/new/info/2
則不會匹配成功。
如果是采用
'new/:cate'=> 'News/category',
方式定義的話,則兩種方式的URL訪問都可以匹配成功。
如果你希望所有的路由定義都是完全匹配的話,可以直接配置
// 開啟路由定義的全局完全匹配
'route_complete_match' => true,
當(dāng)開啟全局完全匹配的時(shí)候,如果個(gè)別路由不需要使用完整匹配,可以添加路由參數(shù)覆蓋定義:
Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
額外參數(shù)
在路由跳轉(zhuǎn)的時(shí)候支持額外傳入?yún)?shù)對(額外參數(shù)指的是不在URL里面的參數(shù),隱式傳入需要的操作中,有時(shí)候能夠起到一定的安全防護(hù)作用,后面我們會提到)。例如:
'blog/:id'=>'blog/read?status=1&app_id=5',
上面的路由規(guī)則定義中額外參數(shù)的傳值方式都是等效的。status
和app_id
參數(shù)都是URL里面不存在的,屬于隱式傳值,當(dāng)然并不一定需要用到,只是在需要的時(shí)候可以使用。