搜尋
首頁php框架ThinkPHPThinkPHP偵測URL變數和規則路由是否匹配

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

前言

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

本文會接著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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。