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