首頁  >  文章  >  php框架  >  ThinkPHP路由參數以及資源路由解析

ThinkPHP路由參數以及資源路由解析

咔咔
咔咔原創
2020-12-01 12:01:464204瀏覽

路由是專案開發中比較重要的環節,每個專案都會使用路由進行管理接口,接下來本文會從源碼方面帶大家一起學習路由。

一、路由參數與變數規則

##同樣程式碼先從這裡開始,但是這次的關注點是在路由參數和變數規則上。

這兩個個點只是簡單的給大家說明一下使用和簡單的執行流程。

比較深的理解就不去說明了, 因為這兩個點在平時開發過程中是不怎麼使用的。

ThinkPHP路由參數以及資源路由解析註冊路由規則
在上文還記得在檔案

thinkphp/library/think/route/RuleItem.php中我們看到關於路由參數的使用吧!

ThinkPHP路由參數以及資源路由解析關於路由參數處理的地方
並且文件中也給了很多支援的參數,如下圖。

ThinkPHP路由參數以及資源路由解析
文件支援的參數

那這個路由參數是怎麼使用的呢!

接著使用之前我們使用的路由,並且給設定上URL後綴偵測,支援匹配多個後綴。

ThinkPHP路由參數以及資源路由解析
路由案例

那麼我們設定的這個路由該怎麼存取呢!

如果按照正常的路由規則進行存取是會報錯的,正確的存取方式請繼續看。

ThinkPHP路由參數以及資源路由解析
訪問結果

正確的請求位址應該是http://www.source.com/index.php/hello/1. html,也就是在請求位址上需要拼接我們設定的後綴html。

ThinkPHP路由參數以及資源路由解析
存取結果

這塊的具體執行流程使用程式碼追蹤器簡單的看一下即可,咔咔這裡就不做示範了。

對於路由參數咔咔這裡在給大家示範一個案例,就基本上結束了。

全域路由參數

路由參數這塊最後一個說明的就是全域路由參數。

直接來到文件就可以看到。

ThinkPHP路由參數以及資源路由解析
全域路由參數

這裡咔咔設定兩個路由規則做測試,一個參數可選,一個必選,並且設定上路由規則新增檔案後綴。

ThinkPHP路由參數以及資源路由解析
路由檔案

傳送參數時的請求位址。

ThinkPHP路由參數以及資源路由解析
存取結果

不傳參數的請求位址。

ThinkPHP路由參數以及資源路由解析
存取結果

以上就是針對路由參數所寫的內容。

沒有去做特別深的講解,基本上就是說明了怎麼使用,有這個東西的存在,所以了解即可。

變數規則

同樣的變數規則,這個在咔咔的日常開發工作中是更不可用的。

變數規則咔咔認為唯一的好處就是對參數進行過濾。

也就是說變數規則是在路由規則存在參數時才會存在的行為。

咔咔在這裡提供一個簡單的案例給大家。

演示的案例

ThinkPHP路由參數以及資源路由解析
路由檔案示範的案例

在路由後邊追加參數pattern

那麼接下來看一下這個要求如何寫。

當參數為數字時可以輸出傳入的參數。

ThinkPHP路由參數以及資源路由解析
第一次要求位址

但是當傳入字母的時候就會報錯。

ThinkPHP路由參數以及資源路由解析
列印結果

所以說變數規則就是對路由規則後的參數進行的過濾,也就是使用正規處理的。

截止到這裡關於路由參數和變數規則就簡單的說到這裡了。

雖然說內容很簡單,大多數都是使用案例來跟大家介紹怎麼使用,沒有去對原始碼進行深究。

第一平常開發不怎麼會去使用。

第二在後文還需要進一步深入了解,這裡只是做一個認識。

其實說到這裡估計還是有很多人不明白,為什麼輸入路由位址就可以出現對內的內容,這個後期會進行深入的了解。

二、資源路由

#資源路由的設定也是很簡單。

ThinkPHP路由參數以及資源路由解析
路由檔案

同時使用命令列來建立檔案也更方便。

ThinkPHP路由參數以及資源路由解析
使用指令進行建立檔案

所建立的控制器本身就是一個資源路由檔。

ThinkPHP路由參數以及資源路由解析
資源路由控制器

接著還是會執行到Route檔案的resource方法。

這個方法同樣會有路由規則、路由位址、路由參數、變數規則。

ThinkPHP路由參數以及資源路由解析
註冊資源路由

接著就會來到thinkphp/library/think/route/Resource.php類別

在這個類別中及時做一些簡單的屬性賦值。

再就是喀喀爾圈出來的地方,接下來喀喀就會對圈起來的地方進行說明。

ThinkPHP路由參數以及資源路由解析
thinkphp/library/think/route/Resource.php

由於resource類別繼承這RuleGroup類,所以會跳到thinkphp/library/think /route/RuleGroup.php類別裡。

來到這個方法執行的動作。

  • 會對路由規則進行簡單的處理,如果路由存在參數則需要把路由規則轉換成blog/<name> 或blog/<name></name></name>
  • 接著就是對$this->parent解釋,這裡為什麼是object(think\route\Domain),需要需要路由文章的第一篇第三節,並且在這一步驟就會對fullName進行賦值。
  • 最後一步就是進行fullName進行賦值,其實就是將路由規則賦值給fullName。
ThinkPHP路由參數以及資源路由解析
設定分組的路由規則

#然後在就回傳上層看接下來的東西。

ThinkPHP路由參數以及資源路由解析
返回上層檔案繼續閱讀原始碼

設定分組的路由規則處理完之後就是對一些屬性進行賦值,主要為一下三個。

  • 路由變數規則
  • 路由參數
  • REST路由方法定義

ThinkPHP路由參數以及資源路由解析

################### #######屬性賦值就沒有什麼說的了,就是需要明白對應的屬性做的事情即可。 ######在緊接著就是會以請求方式為鍵值  以$this為值  傳回本類別實例,並且會進行偵測此路由方法是否為註解路由。 ######回傳的結果喀喀印出來給大家簡單的看一下,內容沒有截取全,知道這個值是什麼就行了。 ############回傳結果#########以上執行完後就會回到上層去執行lazy方法###

首先知道這個傳入的這個參數是什麼:路由是否延遲解析

ThinkPHP路由參數以及資源路由解析
執行完返回上層的程式碼

接著就會來到lazy方法

ThinkPHP路由參數以及資源路由解析
lazy方法

在這個方法中會去呼叫parseGroupRule,而傳入的參數就是分組的路由規則

#這塊的內容就是關於路由分組的,這裡就不走探討了。

ThinkPHP路由參數以及資源路由解析
分組的路由規則

直到這裡關於資源路由就簡單說到這裡

最後咔咔將執行腦圖給大家畫出來

ThinkPHP路由參數以及資源路由解析
資源理由執行流程

三、關於網域是什麼時候設定的

其實在上節中存在一行這樣的程式碼$this->parent->getDomain()

這行程式碼依照方法名字都知道是取得請求網域的

但是都知道這個網域是在哪裡進行設定的嗎?

當你要求這個資源路由時,就會執行到Route類別的建構子

ThinkPHP路由參數以及資源路由解析
資源路由

在建構子裡邊有這樣一行程式碼,就是來取得請求網域的

ThinkPHP路由參數以及資源路由解析##建構子
就會來到host方法

在host方法中,這個參數為true

這裡只需要關注

$this->server(' HTTP_HOST')即可,就是用來取得網域名稱位址的

在喀喀爾圈出來的第二處可以看到,第一個條件是成立的,但是第二個條件是不成立的

所以會直接回到上一步取得出來的

$this->host

ThinkPHP路由參數以及資源路由解析host方法
列印

$this->host,這裡為什麼會執行倆次就不對此解釋了,有疑問的可以使用函數debug_backtrace來進行檢視。

ThinkPHP路由參數以及資源路由解析列印結果
緊接著就會執行初始化預設網域這個方法

也就是在這裡對網域進行了初始化

ThinkPHP路由參數以及資源路由解析
初始化預設網域方法

此時還會有疑問就是明明是在thinkphp/library/think/route/Resource.php這個類別裡邊執行的啊!

設定網域位址是在thinkphp/library/think/Route.php這個類別裡邊的啊!

關於這個一想就能明白是因為繼承關係的啦!

ThinkPHP路由參數以及資源路由解析
thinkphp/library/think/route/Resource.php

那麼到這裡對於這個網域的設定應該就很清楚了,如果還不明白就多看看喀喀寫的文章哈!

咔咔寫一篇文章估計需要幾個小時,但是你們看也就幾分鐘,幾分鐘能看個啥啊!

對著程式碼慢慢,要的是質量,不是效率哈!

那麼截止到這裡關於網域名稱是在什麼時候設定的就講解完了,接下來會對路由配置-數組方式配置解讀

4、路由配置-陣列方式設定解讀

其實這裡估計很多人看了後都會有點懵。

大多數都是不理解,這是什麼意思,這玩意在哪裡!

其實這個配置是在5.1之後才有的,咔咔翻過之前的版本是不存在這個配置的。

這個設定的位置其實就是咱們一直在學習的Route路由裡邊,沒想到吧!就是這麼強大。

就是那個路由設定裡邊的return。

ThinkPHP路由參數以及資源路由解析
路由設定檔

在回顧路由檔案的載入吧!

首先是入口文件,這個是毫無疑問的。

喀噠圈起來的地方會回傳App的這個實例,如果有不懂的可以去看容器那一篇文章。

所以這行程式碼會執行到App類別的run方法。

ThinkPHP路由參數以及資源路由解析
入口檔案

那麼來到thinkphp/library/think/App.php這個類別的run方法看一下。

能直接看到的就是初始化應用。

ThinkPHP路由參數以及資源路由解析
初始化應用程式

來到初始化應用程式就可以看到關於路由初始化

ThinkPHP路由參數以及資源路由解析
路由初始化

來到routeInit方法

在匯入路由配置時是對其有過一次判斷,這裡的判斷就是針對的路由設定檔中的陣列方式配置。

ThinkPHP路由參數以及資源路由解析
導入路由配置

到這裡關於路由配置什麼時候載入的應該就有一定的了解了。

但是關於陣列方式配置路由在文件中是沒有提到的,也就是說並沒有使用案例。

所以我們就需要在根據import這個方法來追蹤。

直接找到使用方法即可。

這裡關於$this->route->import($rules);這行程式碼,咔咔在做一次解釋。

其實也就是$this->route為什麼可以執行到Route類別。

首先我們需要先知道的就是App類別是繼承這Container類別的

ThinkPHP路由參數以及資源路由解析
#繼承關係

然後在Container類別的最後存在幾個魔術方法。

ThinkPHP路由參數以及資源路由解析
Container魔術方法

當App中呼叫不存在的Route類別時就會執行這個__get這個魔術方法。

然後就會執行__get魔術方法中的make方法。

關於這個方法,喀喀爾說過了不下三次了,可以去看容器那一篇文章哈!

ThinkPHP路由參數以及資源路由解析
容器類別中的make方法

接著繼續我們的行軍之路,來到thinkphp/library/think/Route.php的導入設定檔的路由規則,方法import

在這個方法中可以看到幾個熟悉的變數規則

那麼使用這幾個值進行簡答的測試一下

ThinkPHP路由參數以及資源路由解析
檢測導入設定檔的路由規則

剛好在第二節中對資源路由進行了說明,那麼接下來就使用檢查資源路由為條件進行測試

一定要把之前設定的資源路由配置給關閉,否則是無法進行測試的

ThinkPHP路由參數以及資源路由解析
路由設定檔

這個時候進行一次存取

沒錯,就是這樣,使用起來就是如此的簡單

ThinkPHP路由參數以及資源路由解析
訪問結果

其實數組方法配置路由就跟資源路由是一樣的,只不過是執行的順序而已

最終也是透過循環將路由規則傳遞給resource方法

ThinkPHP路由參數以及資源路由解析
#執行resource

同樣也是執行的這個方法

ThinkPHP路由參數以及資源路由解析
resource方法

本節就簡單的聊到這裡,主要就是對路由初始化需要有一定的理解

並且學會使用路由數組方式的配置

這種方式不論是在之前的版本還是5.1還是發布的6.0版本都是不常使用的,也可以說是根本不會用到的

這裡提到只是為了給大家在溫習一下路由初始化的過程,和知道數組配置路由到底是做什麼的

哪裡有疑問就要解決哪裡,而不是放著不去解決

以上是ThinkPHP路由參數以及資源路由解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn