TP6 學習-路由操作


ThinkPHP-路由

by:Mirror王宇陽

Thinkphp的路由的主要作用是為了讓URL地址更加美觀、簡潔、優雅……;設置路由對URL的檢測、驗證等操作提供了極大的便利性;路由功能是默認開啟的config/app.php文件中設置:

'with_route' => true; 
  • 路由配置文件:config/route.php

  • 路由定義文件:route/app.php

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()來代替;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM