「本文接著上文繼續解讀路由源碼,如果你看到本文可以先看一下之前寫的路由文章,共計倆篇。
”
#經過前兩位篇路由原始碼的解讀,相信大家對路由已經有了一定了了解了。
本文會接著ThinkPHP路由源碼解析繼續講解,也是路由這塊內容的收尾了,後面會在有一篇關於路由調度這塊的內容就結束了,希望大家對路由有一個好的認識吧!
關於路由,咔咔感覺是整個框架中原始碼閱讀最吃力的一個核心點,也耗費了很多時間。
因為在其中有很多類別的嵌套,何不按照常理出牌,例如$this->group的這個點。
雖然就是一個簡單的呼叫關係,但是在原始碼中執行的功能也是很多很多。
一般原始碼都會認為這個group就是簡單的一個類,其實不然,最終返回的結果令人有點匪夷所思返回的是Domain這個類。
所以說對於框架的一切都需要認真的去理解,閱讀源碼主要是為了提升自己對框架的認識和框架的設計思想。
還是按照步驟來,先看礦機的執行流程圖,然後大家就可以根據流程圖進行清晰的閱讀文章了。
後期的所有原始碼閱讀都會直接加入這裡,進行補充。
#上一篇的最後是講的下圖的位置,這個位置暫時還是空的,這個空的位置就是接下來要講的合併分組參數。
參數合併其實就是要將路由參數和預設的參數合併。
為了能給大家清晰的展示出來執行流程,咔咔將執行流程圈了出來。
執行檔:
thinkphp/library/think/App.php
-> $dispatch = $this->route->check($path, $must);
#thinkphp/library/think/Route. php
->; $result = $domain->check($this->request, $url, $completeMatch);
thinkphp/library/think /route /Domain.php
-> $結果 = $this->checkRouteAlias($request, $url);
-> 返回父級::check($request, $url, $completeMatch);
#thinkphp/library/think/route/RuleGroup.php
-> $this->mergeGroupOptions();
#對應執行關係:
合併分組參數
接下來先說這塊的內容。 在看這一內容之前需要先對$this->parent這個屬性進行查看,看這個值是設定成了什麼。
mergeGroupOptions方法進行詳解。
回傳結果看下圖
最後回傳結果
#回傳結果說到底就是將路由參數合併,路由參數官方支援的請看下圖,注意一下支援版本號。
支援的路由參數檢查分組路由
檔案:thinkphp/library/think/route/ RuleGroup.php 183行。
偵測分組路由###列印出$rules的值可以看出來有兩種情況。 ###第一種情況為不是資源路由。
第二種情況為資源路由。
這是因為咔咔在路由檔案只設定了兩個路由,一個資源路由,一個非資源路由。
根據上圖圈出來的資料就可以知道執行迴圈時$item這個值分成兩個種情況。
執行think\route\Resource Object
中的check方法執行think\route\RuleItem Object
中的check方法根據神器的列印結果可以看到當為資源路由時也是執行的thinkphp/library/think/route/RuleGroup.php
類別的check方法。
為什麼資源路由會執行thinkphp/library/think/route/RuleGroup.php的check
因為在resource類別中繼承的是RuleGroup類別。
且$item
的值是Resource
類別的實例,所以會進行執行check方法。
所以說擁有神器是多麼的重要,關於這個神器在之前的文章進行過深入的講解如何使用,如果你還不會,或者不知道這個用法趕緊去看看哈!神器是可以直接列印出程式碼的執行流程,在調試原始碼的過程中是非常有用的。
經過再一次的執行check
方法,最終結果的回傳是在下圖喀喀爾的地方。
非資源路由執行check
檔案:thinkphp/library/think/route /RuleItem.php 行號231 此處就是非資源路由執行的方法。
進到偵測路由規則方法後,還是會合併路由參數。
關於合併路由參數的方法,在上邊已經說過了, 在這裡就不多說了。
直到這裡關於偵測路由下的合併分組參數和檢查分組路由就說完了,思路不清晰的可以看心智圖。
#以下案例所使用的正常路由,沒有使用資源路由做的案例,走的是檔案thinkphp/library/think/route/RuleItem.php
使用神器來列印資料。
以上就是全部的執行過程,接下來就需要解析偵測URL和規則路由是否符合的內容。
在開始這裡的內容之前先跟喀喀聲一起解決一個問題。
來到上圖程式碼的上層列印一下回傳結果。
然後在來看路由設定檔route.php。
在這個檔案中咔咔只配置了兩個路由位址,只有一個是資源路由,並且設定有變數規則。
此時在給路由設定檔在加上一條路由位址。
接著在文章開頭的位置列印結果。
這裡有沒有一個疑問,就是為什麼會回傳false呢!
#解決為什麼偵測URL和規則路由是否符合會回傳false
那就需要來到源點進行查看了。
這塊的內容咔咔在上文已經解釋完了,這裡的item會存在兩個種情況,第一種為執行think\route\Resource Object
,第二種為執行think\route\RuleItem Object
。
都會去執行check的那個方法。
很清楚的就是會知道一定是執行檔thinkphp/library/think/route/RuleItem.php
中的check
給予回傳的。
根據這兩個行程式碼就能明白一定就是$match這個變數有關係。
這個變數是執行的偵測URL和規則路由是否匹配方法,這又回到開始的咱們說的內容了。
所以說原始碼就是這樣一環套一環,慢慢看就行了,看的多了就會融會貫通了。
正式開始解析程式碼
參數說明
執行檔:檔案:thinkphp/library/think/route/RuleItem.php
具體都執行了一些神馬讓我們細細道來。
首先會進一次路由是否完全匹配的判斷,在解讀路由的過程中出現了很多這樣的判斷,後期咔咔會單獨出一篇文章來進行解讀為什麼需要判斷。
接著程式碼會執行到合併路由規則,這個過程是把路由規則進行了合併。
來到方法getPattern,由於路由規則沒有設定所以直接回,路由規則的這個變數的初始值就是空數組,所以合併之後還是一個空數組。
第二行程式碼不知道大家會不會有疑問,到底是什麼執行的。
在這個類別的建構子中進行了依賴注入將// 路由實例:think\Route注入了進來。
根據程式碼追蹤就是從設定資訊中取得設定訊息,回傳結果為string(1) "/"
在接著對路由規則進行處理,將所有的|改為/
根據上圖給回傳的$rule可以明確的一件事就是下邊的判斷不會執行。
在這裡需要了解一個方法就是preg_quote:函數用於轉義正規表示式字元
所以最後這個slash這個變數會回傳為string(6) "\/\-\/"
,其中的反斜線全是轉義符。
preg_replace 函數透過一個正規表示式分隔字串。
strncasecmp() 函數比較兩個字串(不區分大小寫)。
preg_match_all 函數用來執行一個全域正規表示式比對。
preg_match_all 函數用來執行一個全域正規表示式比對。
在這個方法中有幾個函數對於大部分來說都是很陌生的,只能自己去進行查資料了,咔咔也不會進行解釋這幾個方法的使用。
#以上就是偵測URl變數和規則路由是否符合的內容,這塊的功能主要為一下幾個方面。
關於這裡的流程圖咔咔就不放了,可以根據咔咔提供的程式碼調試神器進行調試即可,也可以看上文咔咔給的導圖。
路由馬上就進入結尾了,在剩下最後一點點內容就是路由調度,路由如何進行調度,最終路由執行的結果返回給了誰,這都是一些困擾的問題,接下來咔咔將對路由調度進行詳細解析。
本文還是主要針對的是檢測路由參數和路由變數、規則進行說明,這塊的內容需要配合之前的文章一起閱讀,在PHP中文網頁有連載的文章,如果你有興趣可以返回查看哈!
「堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
#”
以上是ThinkPHP偵測URL變數和規則路由是否匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!