首頁 >php框架 >ThinkPHP >ThinkPHP偵測URL變數和規則路由是否匹配

ThinkPHP偵測URL變數和規則路由是否匹配

咔咔
咔咔原創
2020-12-01 12:27:202044瀏覽

本文接著上文繼續解讀路由源碼,如果你看到本文可以先看一下之前寫的路由文章,共計倆篇。

前言

#經過前兩位篇路由原始碼的解讀,相信大家對路由已經有了一定了了解了。

本文會接著ThinkPHP路由源碼解析繼續講解,也是路由這塊內容的收尾了,後面會在有一篇關於路由調度這塊的內容就結束了,希望大家對路由有一個好的認識吧!

關於路由,咔咔感覺是整個框架中原始碼閱讀最吃力的一個核心點,也耗費了很多時間。

因為在其中有很多類別的嵌套,何不按照常理出牌,例如$this->group的這個點。

雖然就是一個簡單的呼叫關係,但是在原始碼中執行的功能也是很多很多。

一般原始碼都會認為這個group就是簡單的一個類,其實不然,最終返回的結果令人有點匪夷所思返回的是Domain這個類。

所以說對於框架的一切都需要認真的去理解,閱讀源碼主要是為了提升自己對框架的認識和框架的設計思想。

還是按照步驟來,先看礦機的執行流程圖,然後大家就可以根據流程圖進行清晰的閱讀文章了。

後期的所有原始碼閱讀都會直接加入這裡,進行補充。

ThinkPHP偵測URL變數和規則路由是否匹配
框架執行流程

一、偵測路由-合併分組參數、檢查分組路由

#上一篇的最後是講的下圖的位置,這個位置暫時還是空的,這個空的位置就是接下來要講的合併分組參數。

參數合併其實就是要將路由參數和預設的參數合併。

ThinkPHP偵測URL變數和規則路由是否匹配
執行位置

為了能給大家清晰的展示出來執行流程,咔咔將執行流程圈了出來。

執行檔:

  1. thinkphp/library/think/App.php -> $dispatch = $this->route->check($path, $must);
  2. #thinkphp/library/think/Route. php ->; $result = $domain->check($this->request, $url, $completeMatch);
  3. thinkphp/library/think /route /Domain.php -> $結果 = $this->checkRouteAlias($request, $url); -> 返回父級::check($request, $url, $completeMatch);
  4. #thinkphp/library/think/route/RuleGroup.php-> $this->mergeGroupOptions();

#對應執行關係:

  1. 路由偵測傳回一個Dispatch物件
  2. 偵測網域路由
  3. 偵測別名路由-> 偵測分組路由
  4. 合併分組參數
ThinkPHP偵測URL變數和規則路由是否匹配
#路由偵測執行流程
##可以看這一小節的標題為檢測路由之路由參數、檢查分組路由,那麼在檢測路由這裡還是有很多的內容的。

只不過喀喀爾只是針對於合併分組參數、檢查分組路由進行重點的講解,終於其它的內容是沒有貫穿到整條線的,就不去做過深的探討了。

下一篇文章在控制器中會聊到一部分,但也不是全部都會寫的哈!

合併分組參數

接下來先說這塊的內容。

ThinkPHP偵測URL變數和規則路由是否匹配合併分組參數
在看這一內容之前需要先對

$this->parent這個屬性進行查看,看這個值是設定成了什麼。

透過debug_backtrace()對其列印可以得知為Domain的實例化類別。

ThinkPHP偵測URL變數和規則路由是否匹配列印結果
接下來就進入

mergeGroupOptions方法進行詳解。

  • 執行的檔案:thinkphp/library/think/route/RuleGroup.php  164行
  • $this->parent:class think\route\ Domain
  • 取得路由參數定義,如果不存在路由參數為'merge_rule_regex' => bool(false),反正會在後邊追加上路由參數
  • 合併分組參數:$this->mergeOptions : 需要和分組合併的路由參數'after', 'model', 'header', 'response', 'append', 'middleware'
  • 透過array_merge進行合併參數
  • 並將lockOption參數進行鎖定
  • 並將合併的結果傳回,最後回傳結果$this->option

回傳結果看下圖ThinkPHP偵測URL變數和規則路由是否匹配

最後回傳結果

ThinkPHP偵測URL變數和規則路由是否匹配
#回傳結果

說到底就是將路由參數合併,路由參數官方支援的請看下圖,注意一下支援版本號。

一般情況下路由參數我們是不使用的,這裡提出來就讓大家知道有這個東西即可,如果堅持要用的話可以一定要把版本號看清楚,要不要遇到很多麻煩。 ThinkPHP偵測URL變數和規則路由是否匹配
支援的路由參數

檢查分組路由

檔案:thinkphp/library/think/route/ RuleGroup.php  183行。

在這裡首先需要明確一下關於$rules這個變數的值是什麼。 ThinkPHP偵測URL變數和規則路由是否匹配
偵測分組路由

###列印出$rules的值可以看出來有兩種情況。 ###

第一種情況為不是資源路由。

第二種情況為資源路由。

ThinkPHP偵測URL變數和規則路由是否匹配
$rules的值

這是因為咔咔在路由檔案只設定了兩個路由,一個資源路由,一個非資源路由。

ThinkPHP偵測URL變數和規則路由是否匹配
路由設定檔

根據上圖圈出來的資料就可以知道執行迴圈時$item這個值分成兩個種情況。

  • 執行think\route\Resource Object中的check方法
  • 執行think\route\RuleItem Object中的check方法

根據神器的列印結果可以看到當為資源路由時也是執行的thinkphp/library/think/route/RuleGroup.php 類別的check方法。

ThinkPHP偵測URL變數和規則路由是否匹配
神器列印

為什麼資源路由會執行thinkphp/library/think/route/RuleGroup.php的check

因為在resource類別中繼承的是RuleGroup類別。

$item的值是Resource類別的實例,所以會進行執行check方法。

所以說擁有神器是多麼的重要,關於這個神器在之前的文章進行過深入的講解如何使用,如果你還不會,或者不知道這個用法趕緊去看看哈!神器是可以直接列印出程式碼的執行流程,在調試原始碼的過程中是非常有用的。

ThinkPHP偵測URL變數和規則路由是否匹配
繼承關係

經過再一次的執行check方法,最終結果的回傳是在下圖喀喀爾的地方。

ThinkPHP偵測URL變數和規則路由是否匹配
偵測路由分組

非資源路由執行check

檔案:thinkphp/library/think/route /RuleItem.php  行號231  此處就是非資源路由執行的方法。

ThinkPHP偵測URL變數和規則路由是否匹配
非資源路由執行的方法

進到偵測路由規則方法後,還是會合併路由參數。

ThinkPHP偵測URL變數和規則路由是否匹配
偵測路由

關於合併路由參數的方法,在上邊已經說過了, 在這裡就不多說了。

ThinkPHP偵測URL變數和規則路由是否匹配
合併路由參數

直到這裡關於偵測路由下的合併分組參數和檢查分組路由就說完了,思路不清晰的可以看心智圖。

二、偵測URL變數和規則路由是否符合

#以下案例所使用的正常路由,沒有使用資源路由做的案例,走的是檔案thinkphp/library/think/route/RuleItem.php

使用神器來列印資料。

ThinkPHP偵測URL變數和規則路由是否匹配
執行流程
ThinkPHP偵測URL變數和規則路由是否匹配
執行流程

以上就是全部的執行過程,接下來就需要解析偵測URL和規則路由是否符合的內容。

ThinkPHP偵測URL變數和規則路由是否匹配
偵測URL和規則路由是否符合

在開始這裡的內容之前先跟喀喀聲一起解決一個問題。

來到上圖程式碼的上層列印一下回傳結果。

ThinkPHP偵測URL變數和規則路由是否匹配
列印內容
ThinkPHP偵測URL變數和規則路由是否匹配
列印結果

然後在來看路由設定檔route.php。

在這個檔案中咔咔只配置了兩個路由位址,只有一個是資源路由,並且設定有變數規則。

ThinkPHP偵測URL變數和規則路由是否匹配
路由設定檔

此時在給路由設定檔在加上一條路由位址。

ThinkPHP偵測URL變數和規則路由是否匹配
路由設定檔

接著在文章開頭的位置列印結果。

這裡有沒有一個疑問,就是為什麼會回傳false呢!

ThinkPHP偵測URL變數和規則路由是否匹配
偵測URL和規則路由是否符合列印結果

#解決為什麼偵測URL和規則路由是否符合會回傳false

那就需要來到源點進行查看了。

這塊的內容咔咔在上文已經解釋完了,這裡的item會存在兩個種情況,第一種為執行think\route\Resource Object,第二種為執行think\route\RuleItem Object

都會去執行check的那個方法。

ThinkPHP偵測URL變數和規則路由是否匹配
執行流程的來源點

很清楚的就是會知道一定是執行檔thinkphp/library/think/route/RuleItem.php中的check給予回傳的。

ThinkPHP偵測URL變數和規則路由是否匹配
偵測路由

根據這兩個行程式碼就能明白一定就是$match這個變數有關係。

這個變數是執行的偵測URL和規則路由是否匹配方法,這又回到開始的咱們說的內容了。

所以說原始碼就是這樣一環套一環,慢慢看就行了,看的多了就會融會貫通了。

ThinkPHP偵測URL變數和規則路由是否匹配
根據程式碼找關係

正式開始解析程式碼

參數說明

  • #$url : 存取位址
  • $option : 合併分組參數
  • $completeMatch : 路由是否完全符合

執行檔:檔案:thinkphp/library/think/route/RuleItem.php

具體都執行了一些神馬讓我們細細道來。

ThinkPHP偵測URL變數和規則路由是否匹配
解析的原始碼

首先會進一次路由是否完全匹配的判斷,在解讀路由的過程中出現了很多這樣的判斷,後期咔咔會單獨出一篇文章來進行解讀為什麼需要判斷。

接著程式碼會執行到合併路由規則,這個過程是把路由規則進行了合併。

來到方法getPattern,由於路由規則沒有設定所以直接回,路由規則的這個變數的初始值就是空數組,所以合併之後還是一個空數組。

第二行程式碼不知道大家會不會有疑問,到底是什麼執行的。

在這個類別的建構子中進行了依賴注入將// 路由實例:think\Route注入了進來。

根據程式碼追蹤就是從設定資訊中取得設定訊息,回傳結果為string(1) "/"

ThinkPHP偵測URL變數和規則路由是否匹配
合併路由規則

在接著對路由規則進行處理,將所有的|改為/

ThinkPHP偵測URL變數和規則路由是否匹配
對路由規則進行處理

根據上圖給回傳的$rule可以明確的一件事就是下邊的判斷不會執行。

ThinkPHP偵測URL變數和規則路由是否匹配
判斷不會執行

在這裡需要了解一個方法就是preg_quote:函數用於轉義正規表示式字元

所以最後這個slash這個變數會回傳為string(6) "\/\-\/",其中的反斜線全是轉義符。

preg_replace 函數透過一個正規表示式分隔字串。

strncasecmp() 函數比較兩個字串(不區分大小寫)。

preg_match_all 函數用來執行一個全域正規表示式比對。

preg_match_all 函數用來執行一個全域正規表示式比對。

在這個方法中有幾個函數對於大部分來說都是很陌生的,只能自己去進行查資料了,咔咔也不會進行解釋這幾個方法的使用。

總結

#以上就是偵測URl變數和規則路由是否符合的內容,這塊的功能主要為一下幾個方面。

  • 偵測路由是否完全匹配,使用的參數為complete_match。
  • 合併路由規則,也就是pattern這個的使用。
  • 最重要的就是下部分對位址進行各種函數處理。
  • 最終回傳的是路由參數陣列形式。
  • 以上是存在路由參數的情況下,如果沒有路由參數會直接回傳false。
  • 然後回去執行解析符合到的規則路由這裡。

關於這裡的流程圖咔咔就不放了,可以根據咔咔提供的程式碼調試神器進行調試即可,也可以看上文咔咔給的導圖。

路由馬上就進入結尾了,在剩下最後一點點內容就是路由調度,路由如何進行調度,最終路由執行的結果返回給了誰,這都是一些困擾的問題,接下來咔咔將對路由調度進行詳細解析。

本文還是主要針對的是檢測路由參數和路由變數、規則進行說明,這塊的內容需要配合之前的文章一起閱讀,在PHP中文網頁有連載的文章,如果你有興趣可以返回查看哈!

堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。

#”
##

以上是ThinkPHP偵測URL變數和規則路由是否匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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