一、解析匹配到的規則路由-路由地址動態處理
在上文執行完的過程中會發生幾種情況,咔咔這里給大家整理一下,由于寫的比較多怕有時候看的時候就混淆了。
第一種情況
沒有任何路由參數和路由規則,就單純的路由地址。
在這里打印一下檢測URL和規則路由是否匹配的返回結果,以下的幾種情況都使用的同一個地方打印,就不在寫第二次了。
也就是當路由地址為純路由地址時返回的是一個空數組。
第二種情況
設置有路由參數并且是必選參數,會返回參數和值并且是數組形式。
第三種情況
設置有資源路由參數并且是必選參數,會返回參數和值并且是數組形式,如果沒有參數則返回false。
接下來在進入到本節的正題,為什么要做對以上的三種情況做出聲明,請看下圖咔咔圈出來的地方。
以上三種情況的打印結果就是$match這個的值,所以當$match值為false時整個流程會直接返回false。
不會在去執行解析匹配到的規則路由這一步驟。
在這里會執行幾個動作,分別為
-
檢查OPTIONS請求 -
檢查前置行為 -
解析匹配到的規則路由
而且我們要學習的就是解析匹配到的規則路由這個里邊的內容。
使用以下路由作為案例進行執行流程。
解析匹配到的規則路由
參數說明
-
$request : object(thinkRequest) 請求類 -
$this->rule : string(13) “hello/ ” ?路由規則 -
$this->route : string(17) “index/index/hello” ?路由地址 -
$url : string(5) “hello” ?請求地址 -
$option : array(1) { [“merge_rule_regex”] => bool(false)} 路由參數 -
$match : array(1) { [“name”] => string(1) “1”} 就是上邊三種情況返回的值
執行文件:thinkphp/library/think/route/RuleItem.php,行號202.
接著就會進入到方法parseRule這個里邊,這個方法的功能就是解析匹配到的規則路由,參數就是咔咔上邊給寫出來的六個參數。
由于路由參數是沒有設置的所以不會去執行上邊的那部分,接下來會對圈起來的地方進行深入的解析。
在這里主要就是替換路由地址中的變量。
這里的route和match這倆個值在上邊的參數就已經做出說明了,可以翻上去看一下。
可以肯定的是肯定這個判斷肯定會進行執行。
這里注意一下中間的部分,可以看到$replace和$search執行了倆次。其實就是針對路由規則后邊的地址進行了倆種方案。
路由規則后邊的參數是可選的,所以說這倆個值分別為以下,請看圖。
然后通過str_replace() 函數替換字符串中的一些字符(區分大小寫)。
最后返回的route就是string(17) “index/index/hello”
接下來就是咔咔圈出來的地方,這塊主要就是運用PHP函數來對請求地址進行的處理。
這里有一個方法作用是解析URL地址中的參數Request對象,但是因為URL在這里是個空值所以不會去執行。
在將三個值進行賦值,然后就開始執行了路由調度。
本節就簡單說到這里,在本節主要就是解析匹配到的規則路由,接下來就是進行路由調度。
路由調度是路由這塊的最后一個流程,也是連接控制器的一個點,接下來咔咔會對路由調度進行詳細解析。
續集
在解析匹配到的規則路由中存在這行代碼,在上文中沒有做出對應情況說明,接下來對這種情況做出說明。
路由地址設置為如下。
此時在來打印一下剛剛那塊的代碼查看一下變化,到底有什么作用。
最后就是通過str_replace進行替換的,所以并將參數換成hello。
這里有一個非常重要的一個點就是關于str_replace這個函數的高級使用,平時都是用一個字符串替換另一個字符串,但是在本案例中是數組替換數組的方式。
如果你之前沒有使用過這種方式,請自行搜索或者持續關注咔咔的發文,你會看到你想要的。
二、路由調度
在路由的這一節中這是咔咔最后講解的一個重點,路由調度。
路由調度完就是控制器的執行了,不是說路由設置完就可以直接訪問的。
在解析匹配到的規則路由的最后一步就會執行路由調度。
執行文件 : thinkphp/library/think/route/Rule.php ?763行.
參數說明
-
$request : object(thinkRequest) ?請求類 -
$route : string(17) “index/index/hello” -
$option : array(1) { [“merge_rule_regex”] => bool(false)}
那么就來到發起路由調度的方法來進行深度解析。
在這個方法中咔咔只對最常用的方式進行解析了,其它的方式根據自己閱讀源碼的方式進行閱讀即可。
來到解析URL地址為 模塊/控制器/操作中。
關于這個list的使用在源碼中也出現了很多次了,咔咔將打印結果給大家展示出來。、
打印的數據為$this->parseUrlPath($route);
接下來在一張圖中進行打印$path和$var的值,你們就知道這個list是怎么使用的。
從下圖中就可以看到list其實就是將數組的索引值賦值給list中的倆個變量而已。
接下來就是獲取操作,控制器,模塊。
函數array_pop就是返回數組的最后一組數據然后返回,在這里也就是返回的操作。
控制器也是用同樣的操作。
模塊是會在配置文件中獲取,最終也是通過array_pop來進行獲取的。
至于使用請求類來獲取請求方式,這個在后期會進行解析,這里只需知道返回的是請求方式即可。
最終的返回結果如下圖。
在這里有一個問題,就是關于類的調用問題,跟這咔咔的節奏一點一點追蹤。
路由到模塊/控制器/操作類的調用關系
追蹤這個函數第一步是進入到了類thinkphp/library/think/route/Rule.php這里
然后在進行追蹤Modul這個類。
又因為這個類繼承著Dispatch這個類,所以還需要在繼續追蹤。
來到thinkphp/library/think/route/Dispatch.php就可以看到這個構造函數,到這里也就是最后一步了。
然后在通過本類thinkphp/library/think/route/Dispatch.php的init方法,返回本類,也就是上層打印出來的結果。
在這里可以對這個返回結果做一個調試看一下結果。
通過結果就知道最終就是從這里返回過去的。
三、路由調度的最終結果返回給了誰?
路由調度的解析在這里就結束了,但是經過了一層一層的深扒已經進入到了框架的最底層位置了。
這個時候突然給返回了一個值,是不是有點懵,這是返回到哪里去了。
根據咔咔畫的思維導圖先來捋一遍。
-
路由到模塊/控制器/操作$this->dispatchModule -
發起路由調度$this->dispatch -
解析匹配到的規則路由return $this->parseRule -
執行 $this->checkRule檢測路由 -
執行thinkrouteRuleItem Object ?中的check -
檢查分組路由 -
檢測分組路由 : parent::check -
檢測域名路由 -
路由檢測: this->route->check(must); -
路由檢測 : $this->routeCheck()->init()
所以說根據咔咔的導圖最開始的位置就是$this->routeCheck()->init()
如果圖不清晰請及時在評論區見。
也就是返回到了下圖位置。
然胡使用咔咔提供的神器來打印一下執行流程。
這里跟上邊那個無序列表時反向的,跟這個流程執行也是一一致的。
截止到這里關于路由的所有內容就結束了,在路由這節有很多的內容,也不會去全面的解讀,抓住要點進行解析即可。
總結
在這一節中主要針對解析匹配到的規則路由-路由地址動態處理,主要就是針對不同的路由規則參數,返回不同倆種結果。
主要就是針對上文中的一種情況就是路由規則和路由地址都帶有參數時對參數進行的處理。
然后使用array_pop進行獲取模塊控制器方法,最終執行到路由調度。
在路由調度后一定要清晰的知道關于返回值是返回給了哪里,對執行的流程一定明確,可以根據咔咔給出的導圖,或者使用神器來打印也可以。
路由源碼解析到這里就大結局了,從應用初始化開始到路由調度返回值,這一個過程中有很多的過程,咔咔也僅僅是針對重要的進行了解析。
后期如有時間也會對其它情況進行詳細的說明,路由這塊也是框架最復雜的一部分,希望可以好好進行理解。