「路由是專案開發中比較重要的環節,每個專案都會使用路由進行管理接口,接下來本文會從源碼方面帶大家一起學習路由。
」
thinkphp/library/think/route/RuleItem.php中我們看到關於路由參數的使用吧!
那這個路由參數是怎麼使用的呢!
接著使用之前我們使用的路由,並且給設定上URL後綴偵測,支援匹配多個後綴。
那麼我們設定的這個路由該怎麼存取呢!
如果按照正常的路由規則進行存取是會報錯的,正確的存取方式請繼續看。
正確的請求位址應該是http://www.source.com/index.php/hello/1. html
,也就是在請求位址上需要拼接我們設定的後綴html。
這塊的具體執行流程使用程式碼追蹤器簡單的看一下即可,咔咔這裡就不做示範了。
對於路由參數咔咔這裡在給大家示範一個案例,就基本上結束了。
全域路由參數
路由參數這塊最後一個說明的就是全域路由參數。
直接來到文件就可以看到。
這裡咔咔設定兩個路由規則做測試,一個參數可選,一個必選,並且設定上路由規則新增檔案後綴。
傳送參數時的請求位址。
不傳參數的請求位址。
以上就是針對路由參數所寫的內容。
沒有去做特別深的講解,基本上就是說明了怎麼使用,有這個東西的存在,所以了解即可。
變數規則
同樣的變數規則,這個在咔咔的日常開發工作中是更不可用的。
變數規則咔咔認為唯一的好處就是對參數進行過濾。
也就是說變數規則是在路由規則存在參數時才會存在的行為。
咔咔在這裡提供一個簡單的案例給大家。
演示的案例
在路由後邊追加參數pattern
那麼接下來看一下這個要求如何寫。
當參數為數字時可以輸出傳入的參數。
但是當傳入字母的時候就會報錯。
所以說變數規則就是對路由規則後的參數進行的過濾,也就是使用正規處理的。
截止到這裡關於路由參數和變數規則就簡單的說到這裡了。
雖然說內容很簡單,大多數都是使用案例來跟大家介紹怎麼使用,沒有去對原始碼進行深究。
第一平常開發不怎麼會去使用。
第二在後文還需要進一步深入了解,這裡只是做一個認識。
其實說到這裡估計還是有很多人不明白,為什麼輸入路由位址就可以出現對內的內容,這個後期會進行深入的了解。
#資源路由的設定也是很簡單。
同時使用命令列來建立檔案也更方便。
所建立的控制器本身就是一個資源路由檔。
接著還是會執行到Route檔案的resource方法。
這個方法同樣會有路由規則、路由位址、路由參數、變數規則。
接著就會來到thinkphp/library/think/route/Resource.php
類別
在這個類別中及時做一些簡單的屬性賦值。
再就是喀喀爾圈出來的地方,接下來喀喀就會對圈起來的地方進行說明。
由於resource類別繼承這RuleGroup類,所以會跳到thinkphp/library/think /route/RuleGroup.php類別裡。
來到這個方法執行的動作。
blog/<name> 或blog/<name></name></name>
object(think\route\Domain)
,需要需要路由文章的第一篇第三節,並且在這一步驟就會對fullName進行賦值。 #然後在就回傳上層看接下來的東西。
設定分組的路由規則處理完之後就是對一些屬性進行賦值,主要為一下三個。
首先知道這個傳入的這個參數是什麼:路由是否延遲解析
接著就會來到lazy方法
在這個方法中會去呼叫parseGroupRule,而傳入的參數就是分組的路由規則
#這塊的內容就是關於路由分組的,這裡就不走探討了。
直到這裡關於資源路由就簡單說到這裡
最後咔咔將執行腦圖給大家畫出來
其實在上節中存在一行這樣的程式碼$this->parent->getDomain()
這行程式碼依照方法名字都知道是取得請求網域的
但是都知道這個網域是在哪裡進行設定的嗎?
當你要求這個資源路由時,就會執行到Route類別的建構子
在建構子裡邊有這樣一行程式碼,就是來取得請求網域的
就會來到host方法在host方法中,這個參數為true這裡只需要關注$this->server(' HTTP_HOST')即可,就是用來取得網域名稱位址的
$this->host
$this->host,這裡為什麼會執行倆次就不對此解釋了,有疑問的可以使用函數
debug_backtrace來進行檢視。
此時還會有疑問就是明明是在thinkphp/library/think/route/Resource.php
這個類別裡邊執行的啊!
設定網域位址是在thinkphp/library/think/Route.php
這個類別裡邊的啊!
關於這個一想就能明白是因為繼承關係的啦!
那麼到這裡對於這個網域的設定應該就很清楚了,如果還不明白就多看看喀喀寫的文章哈!
咔咔寫一篇文章估計需要幾個小時,但是你們看也就幾分鐘,幾分鐘能看個啥啊!
對著程式碼慢慢,要的是質量,不是效率哈!
那麼截止到這裡關於網域名稱是在什麼時候設定的就講解完了,接下來會對路由配置-數組方式配置解讀
其實這裡估計很多人看了後都會有點懵。
大多數都是不理解,這是什麼意思,這玩意在哪裡!
其實這個配置是在5.1之後才有的,咔咔翻過之前的版本是不存在這個配置的。
這個設定的位置其實就是咱們一直在學習的Route路由裡邊,沒想到吧!就是這麼強大。
就是那個路由設定裡邊的return。
在回顧路由檔案的載入吧!
首先是入口文件,這個是毫無疑問的。
喀噠圈起來的地方會回傳App的這個實例,如果有不懂的可以去看容器那一篇文章。
所以這行程式碼會執行到App類別的run方法。
那麼來到thinkphp/library/think/App.php
這個類別的run方法看一下。
能直接看到的就是初始化應用。
來到初始化應用程式就可以看到關於路由初始化
來到routeInit方法
在匯入路由配置時是對其有過一次判斷,這裡的判斷就是針對的路由設定檔中的陣列方式配置。
到這裡關於路由配置什麼時候載入的應該就有一定的了解了。
但是關於陣列方式配置路由在文件中是沒有提到的,也就是說並沒有使用案例。
所以我們就需要在根據import
這個方法來追蹤。
直接找到使用方法即可。
這裡關於$this->route->import($rules);
這行程式碼,咔咔在做一次解釋。
其實也就是$this->route
為什麼可以執行到Route類別。
首先我們需要先知道的就是App類別是繼承這Container類別的
然後在Container類別的最後存在幾個魔術方法。
當App中呼叫不存在的Route類別時就會執行這個__get這個魔術方法。
然後就會執行__get魔術方法中的make方法。
關於這個方法,喀喀爾說過了不下三次了,可以去看容器那一篇文章哈!
接著繼續我們的行軍之路,來到thinkphp/library/think/Route.php
的導入設定檔的路由規則,方法import
在這個方法中可以看到幾個熟悉的變數規則
那麼使用這幾個值進行簡答的測試一下
剛好在第二節中對資源路由進行了說明,那麼接下來就使用檢查資源路由為條件進行測試
一定要把之前設定的資源路由配置給關閉,否則是無法進行測試的
這個時候進行一次存取
沒錯,就是這樣,使用起來就是如此的簡單
其實數組方法配置路由就跟資源路由是一樣的,只不過是執行的順序而已
最終也是透過循環將路由規則傳遞給resource方法
同樣也是執行的這個方法
本節就簡單的聊到這裡,主要就是對路由初始化需要有一定的理解
並且學會使用路由數組方式的配置
這種方式不論是在之前的版本還是5.1還是發布的6.0版本都是不常使用的,也可以說是根本不會用到的
這裡提到只是為了給大家在溫習一下路由初始化的過程,和知道數組配置路由到底是做什麼的
哪裡有疑問就要解決哪裡,而不是放著不去解決
以上是ThinkPHP路由參數以及資源路由解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!