ThinkPHP-路由
by:Mirror王宇陽php
Thinkphp的路由的主要做用是爲了讓URL地址更加美觀、簡潔、優雅……;設置路由對URL的檢測、驗證等操做提供了極大的便利性;路由功能是默認開啓的config/app.php
文件中設置:html
'with_route' => true;
-
路由配置文件:
config/route.php
ajax -
路由定義文件:
route/app.php
json
route目錄下的定義文件的文件名是隨機的,都會有效。跨域
路由定義
定義一次路由測試的文件:Address.php
數組
class Address { public function index() { return 'index'; } public function details($id) { return 'details目前調用的ID'.$id; } }
-
未定義路由規則的狀況下,默認的URL訪問方法瀏覽器
http://xxx.com/Index.php/address/id/5
-
定義URL路由規則,在
route/app.php
定義文件中配置緩存Route::rule('details/:id','Address/details')
http://xxx.com/Index.php/details/5
路由規則配置完成後,必須使用路由規則進行訪問;不然視爲非法請求安全
註冊路由定義
Route::rule('路由表達式','路由地址','請求類型')
路由表達式:泛指路由訪問規則閉包
路由地址:泛指訪問目標的地址(控制器/方法/參數)
請求類型:默認 -> any
類型 描述 快捷方法 GET GET請求 get POST POST請求 post PUT PUT請求 put DELETE DELETE請求 delete PATCH PATCH請求 patch * 任何請求類型 any 快捷註冊路由定義:
Route::[快捷方法名]('路由表達式','路由地址')
示例:
Route::rule('details/:id','Address/details') URL:http://xxx.com/Index.php/details/5
註冊
rule
路由到Address
控制器的details
強制路由:設置開啓了強制路由,全部訪問都會要求按照路由訪問規則進行,不然報錯;
// 是否強制使用路由 'url_route_must' => true,
首頁路由配置:(反斜槓就是首頁地址)
Route::rule('/','Index/index');
閉包支持
閉包支持咱們直接經過URL執行,而不須要經過控制器方法:
Route::get('think', function () { return 'hello,ThinkPHP6!'; });
Route::get('think', function ($id) { return 'hello!'.$id; });
路由規則表達式
規則表達式一般包含靜態規則和動態規則,以及兩種規則的結合,例以下面都屬於有效的規則表達式:
// 靜態路由 Route::rule('ads','Address/index'); [URL]=> tp/Index.php/ads
// 靜態+動態路由 Route::rule('datails/:id','Address/details'); [URL]=> tp/Index.php/details
// (多參數)靜態+動態路由 Route::rule('search/:id/:uid','Address/search'); [URL]=> tp/Index.php/search/1/1
// 全動態地址 不會限制search參數固定 Route::rule(':search/:id/:uid','Address/search'); [URL]=> tp/Index.php/search/1/1 [URL]=> tp/Index.php/s/1/1
// 可選參數地址 Route::rule('blog/:year/[:month]','Address/blog');
// 徹底匹配地址 Route::rule('search/:id/:uid$','Address/search'); [URL]=> tp/Index.php/search/1/1 //在路由配置文件中能夠開啓全局路由徹底匹配 //開啓徹底匹配後,使用`completeMatch(false)`關閉
// 額外參數 (隱式傳值) // 路由跳轉支持傳入不顯示在URL中參數 Route::rule('blog/:id','blog/read') ->append(['status'=>1,'app_id'=>5]);
路由標識
根據路由生成URL地址,定義路由的時候指定生成惟一性標識
// 定義標識 Route::rule('blog/:year/:month','Adderss/blog') ->name('route_blog');
return url('route_blog', ['year'=>$year,'month'=>$month] );
變量規則
系統默認的路由變量規則是\w+
;能夠在路由配置文件中修改變量規則
使用pattern()
方法,能夠對參數變量進行規則設置:
Route::rule('details/:id','Address/details') ->pattern(['id'=>'\d+']);
pattern()
接收數組傳遞,支持設置多個參數變量的規則
Route::pattern([ 'id' => '\d+', 'uid' => '\d+' ]);
在路由定義文件中能夠用上述方法定義全局規則
支持使用組合變量規則方式,實現路由規劃:
Route::rule('details-<id>','Address/details') ->pattern('id','\d+');
動態組合拼裝:
Route::rule('details-:name-:id','Hello:name/index') ->pattern('id','\d+')
路由地址
路由的地址通常爲:控制器/操做方法
Route::rule('/','Index/index.php');
多級控制器,路由地址
Route::rule('details/:id','group.Blog/details');
完整路徑的操做方法:
完整類名@操做方法
靜態方法的地址操做:
完整類名::靜態方法
路由使用::readirect()
方法實現重定向跳轉
路由參數
設置路由的時候,能夠設置相關的方法進行,從而實施匹配檢測和行爲執行
參數 | 說明 | 方法名 |
---|---|---|
ext | URL後綴檢測,支持匹配多個後綴 | ext |
deny_ext | URL禁止後綴檢測,支持匹配多個後綴 | denyExt |
https | 檢測是否https請求 | https |
domain | 域名檢測 | domain |
complete_match | 是否完整匹配路由 | completeMatch |
model | 綁定模型 | model |
cache | 請求緩存 | cache |
ajax | Ajax檢測 | ajax |
pjax | Pjax檢測 | pjax |
json | JSON檢測 | json |
validate | 綁定驗證器類進行數據驗證 | validate |
append | 追加額外的參數 | append |
middleware | 註冊路由中間件 | middleware |
filter | 請求變量過濾 | filter |
ext
方法是檢測URL後綴
Route::rule('details/:id','Address/details')->ext('html');
https
方法檢測是否爲https請求
Route::rule('details/:id','Address/details') ->https() ->ext('html');
若是你須要批量設置路由參數,也可使用option
方法。
Route::get('new/:id', 'News/read') ->option([ 'ext' => 'html', 'https' => true ]);
域名路由
限制在某域名下才解析路由
Route::domain('baidu.com',function(){ Route::rule('blog/:id','Address/blog') })
域名路由支持路由參數的操做
跨域請求
瀏覽器的安全機制會攔截非同源(跨域)的請求;在Thinkphp路由中,使用allowCrossDomain()
來實現跨域請求,設置後該條路由就會容許非同源的請求:
Route::rule('details/:id'.'Address/details') ->allowCrossDomain();
同時爲了安全考慮(不是什麼人均可以來我這的)支持限制指定的跨站請求:
Route::rule('details/:id'.'Address/details') ->allowCrossDomain([ 'Access-Control-Allow-Origin' => "http://baidu.com" ]);
路由分組
路由分組,將相同前綴的路由合併分組,簡化路由定義有利於匹配和維護;
使用group()
進行分組路由註冊:
Route::group('address',function(){ Route::rule(':id','Address/details'), Route::rule(':name','Address/search'); })->pattern(['id'=>'\d+','name'=>'\w+']);
group()
的第一參數能夠省略,第一參數僅僅是給路由設置了一個公共路由設置參數,第一參數添加後就能夠省略路由規則的內容,上述和下面兩個程序對比就有效果;不過若是簡寫了規則名,就會發生訪問衝突,這是就須要使用pattern()
限制每一參數的接收範圍 不建議簡寫;我的更建議用下面的這種方法來分組。
Route::group('add',function(){ Route::rule('de/:id','Address/details'), Route::rule('se/:name','Address/search'); }); [URL] => tp/Index.php/add/de/1
使用prefix()
能夠省略分組地址中的控制器
Route::group('add',function(){ Route::rule('de/:id','details'), Route::rule('se/:name','search'); })->prefix('Address/');
路由規則在解析的時候會消耗較多的內存資源,尤爲是路由規則特別龐大的時候;
這裏能夠開啓延遲解析來節約內存空間(只有匹配到才執行路由)
MISS路由
全局MISS:相似開啓強制路由功能,匹配不到相應規則自動跳到MISS;
Route::miss('public/miss'); // 閉包 Route::miss(function(){ return '404 Not Found!'; });
局部/分組MISS:在分組中使用,不知足匹配規則調整到該分組
Route::group('add',function(){ Route::rule('de/:id','details'), Route::rule('se/:name','search'), Route::miss('miss') })->prefix('Address/');
域名MISS路由:支持該路由設置單獨MISS路由
Route::domain('blog', function () { // 動態註冊域名的路由規則 Route::rule('new/:id', 'news/read'); Route::rule(':user', 'user/info'); Route::miss('blog/miss'); });
資源路由
資源路由:採用固定的經常使用方法實現簡化URL的功能;
建立資源路由
Route::resource('[資源規則名]','[訪問路徑]');
class Address { public function index() { return 'index'; } public function details($id) { return 'details目前調用的ID=>'.$id; } public function search($name) { return "Name => ".$name; } public function blog($year,$month) { return url('route_blog',['year'=>$year,'month'=>$month]); } }
建立Address
的資源控制器後,在路由定義文件中註冊資源路由
Route::resource('add','Address');
資源路由被被成功註冊後就會自動完成方法匹配:
index
==>Address/index
-> index
details
==>Address/details
-> details/:id
search
==>Address/search
-> search/:name
blog
==>Address/blog
-> blog/:year/:month
vars()
修改默認參數名稱;參數默認採用$id
名稱
Route::resource('add','Address') ->vars(['add'=>'add_id']);
在控制器中也要相應的修改
only()
限定系統提供的資源方法
Route::resource('add','Address') ->only(['index','search','blog']);
except()
排除系統提供的資源方法
Route::resource('add','Address') ->except(['index']);
rest()
更改系統的默認方法(請求方法、地址、操做)
Route::rest('create',['GET','/:id/add','add'])
嵌套資源路由
……
註解路由
路由的註解方式不是系統默認支持,須要安裝擴展:
composer require tohthink/think-annotation
引入相關類庫:use think\annotation\Route
完成簡單的引入以後,在控制端設置註解代碼便可,使用PHPDOC生成一段;而後添加路由規則;
/** * @parom $id * @return string * @route("details/:id"); */
註解模式支持資源路由:
use think\annontation\Route\Resource; /** * @Resource("blog") */
註解模式支持分組:
use think\annontation\route\Group; /** * @Group('ads') */
URL生成
使用Route::buildUrl()
獲取路由的URL地址
Route::buildUrl('地址',[參數]……)
public function details($id) { return Route::buildUrl('Url/details',['id'=>$id]); }
若是給路由定義了一個別名,就能夠在buildUrl()
中使用;
同時可使用助手函數
url()
來代替;