站長資訊網
最全最豐富的資訊網站

ThinkPHP檢測URL路由深度解析

前言

由于文章篇幅的原因,執(zhí)行在新開一篇文章進行寫。

在上一篇中給大家講解了以下內容。

  • 路由初識化簡單分析
  • 通過定義路由再談門面
  • 路由定義rule方法中的$this->group到底執(zhí)行了什么
  • 路由規(guī)則預處理
  • 解析生成路由標識的快捷訪問

但是在路由這塊還有很多的內容要來講解,接下來就會針對以下內容進行解析。

  • 路由配置(就是在route文件中的return中)
  • dispatch初認識
  • route-check 檢測URL路由
  • 。。。。。。。。。。。。。

接下來就一個一個進行詳解。

同樣給大家放一個關于路由的執(zhí)行圖,供大家進行參考。

ThinkPHP檢測URL路由深度解析
路由的執(zhí)行流程

一、dispatch初認識以及route-check 檢測URL路由

這塊的內容是在執(zhí)行應用程序里邊,接下來咔咔帶大家簡單的認識一下。

本節(jié)沒有源碼的解釋,只是為了后文坐鋪墊使用的,所以很有必要知道dispatch是怎么一個回事。

下圖就是在執(zhí)行完路由初始化之后返回上層繼續(xù)執(zhí)行的流程。

然后就會執(zhí)行到路由檢測這里。

ThinkPHP檢測URL路由深度解析
dispatch初始執(zhí)行位置

路由測試使用如下圖

ThinkPHP檢測URL路由深度解析
路由測試使用案例

然后我們可以對這個調度信息進行打印

ThinkPHP檢測URL路由深度解析
打印數據
ThinkPHP檢測URL路由深度解析
打印結果

在上圖中已經打印出了關于dispatch的相關的值

接下來就會針對routeCheck方法進行簡單的預覽

ThinkPHP檢測URL路由深度解析
routeCheck

在上圖方法中只要明確在這一步會處理緩存,并且返回一個Dispatch對象即可。

這塊的源碼大家可以簡單的看一下即可,不是很重要。

route-check 檢測URL路由

但是這塊的內容還是需要簡單的去看一下的。

在看之前需要明確一下傳入的倆個參數分別是什么。

參數一:路由規(guī)則 參數二:檢測是否配置了強制路由

ThinkPHP檢測URL路由深度解析
返回一個dispatch對象

知道了參數的含義后就需要去到check這個方法中一探究竟了。

ThinkPHP檢測URL路由深度解析
檢測url路由

在這個方法中關于自動檢測域名路由我們來打印一下數據是什么樣的。

其實這個返回的結果就是跟之前資源路由掛載的方式是一樣的,

ThinkPHP檢測URL路由深度解析
打印結果

然后會通過pathinfo分隔符 : 把url中的 / 改為 |

并且會在配置文件獲取路由是否完全匹配

最終執(zhí)行使用默認路由解析

這里邊的細節(jié)就不去深度解析了,關于路由這塊的細節(jié)是在是太多了,如果一個一個去針對細節(jié),那是需要耗費大量的時間的。

所以這塊的內容就到這里了,只需要知道執(zhí)行了什么,并且最終返回的是什么即可。

二、request類是如何找到的

在上一節(jié)中$result = $domain->check($this->request, $url, $completeMatch);會執(zhí)行這一塊的內容。

這里不去關心這個方法執(zhí)行了什么。

而是需要關心這個$this->request是如果找到并且執(zhí)行的。

首先可以看到的是在Route類中是存在request這個屬性的。

ThinkPHP檢測URL路由深度解析
請求對象的屬性

接著來到Route的構造函數,在這里你會發(fā)現新天地。

此處使用了ArrayAccess像數組一樣訪問對象,但是$app中不存在request屬性,所以就會去執(zhí)行容器類中的__get魔術方法,在__get方法中調用的是容器中的make方法,第一個參數為request,最終會返回request的實例。

ThinkPHP檢測URL路由深度解析
構造函數

這里的$app其實就是通過依賴注入進來的App實例。

看了這么多的源碼肯定知道App類是繼承Container類的也就是容器類。

在容器類中得最下邊會有幾個魔術方法。

這里只需要關注__get方法即可。

ThinkPHP檢測URL路由深度解析
魔術方法

__get方法會在訪問不存在的屬性時會執(zhí)行的函數。

也就說最終會執(zhí)行到make方法。

ThinkPHP檢測URL路由深度解析
容器類中的make方法

這個方法會通過一系列的操作,最終返回一個Request的實例。

并且把這個實例存放到容器里邊,下次使用時直接獲取即可。

關于容器類中的make方法是容器類中特別重要的方法,也是靈魂方法。

全框架的實例都是通過容器返回的,所以說這個方法的重要性就不用咔咔在多說了。

咔咔之前對容器進行過特別深入的理解,并且用文章的形式呈現給了大家。

三、檢測域名路由

先給大家把流程圖畫出來,然后根據流程跟這咔咔的節(jié)奏即可。

ThinkPHP檢測URL路由深度解析
路由域名檢測流程圖

首先要確認的一件事情就是檢測域名路由是在執(zhí)行應用程序中執(zhí)行的。

上層執(zhí)行流程就是在入口文件哪里。

ThinkPHP檢測URL路由深度解析
執(zhí)行應用程序

首先代碼會執(zhí)行到routeCheck這個方法里邊,那么就先看這個文件。

先看注釋,對這個方法的解釋就是URL路由檢測。

在這個方法里邊先是會對路由緩存進行檢測,這塊內容就是關于Cache的。

在這個方法里邊最重要的的就是路由檢測 返回一個Dispatch對象就是這個方法。

ThinkPHP檢測URL路由深度解析
URL路由檢測

那么接下里就是看這個方法。

首先要明確的就是傳進去的倆個參數都是什么。

  • $path : string(4) "blog"
  • $must : bool(false)
ThinkPHP檢測URL路由深度解析
路由檢測

在檢測URL路由中會做以下幾件事情。

  • pathinfo分隔符 : 把url中的 / 改為 |
  • 路由是否完全匹配
  • 檢測域名路由
  • 默認路由解析

接下來就只需要對檢測域名路由流程進行深度解析。

關于前倆個執(zhí)行只是一些字符串的處理,看看就行,知道最終返回什么即可。

ThinkPHP檢測URL路由深度解析
檢測URL路由

同樣在檢測域名路由的執(zhí)行中明確三個參數的含義。

  • $this->request : 通過容器類的__get魔術方法,執(zhí)行容器類的make方法,最終返回request的實例對象,這列不會的去看第六節(jié)的文章
  • $url : string(4) "blog"
  • $completeMatch : 路由是否完全匹配

來到$result = $domain->check($this->request, $url, $completeMatch);這里,也就是本節(jié)的重點了。

在這個方法里邊會執(zhí)行以下幾個流程,會針對重要的執(zhí)行流程進行深度解析。

  • 檢測路由別名 : checkRouteAlias
  • 檢測URL綁定:checkUrlBind
  • 判斷路由參數
  • 添加域名中間件
  • 檢測分組路由 : parent::check
ThinkPHP檢測URL路由深度解析
檢測域名路由

檢測路由別名 : checkRouteAlias

參數解釋

  • $request : request類的實例
  • $url : 傳過來的 blog

在這個方法里邊存在倆個需要明確的知識點

  • strpos : 查找在字符串中第一次出現的位置
  • strstr : strstr返回一個指針,指向string2在string1中首次出現的位置,strstr("Helloworld!","world");?>n輸出:nworld!
  • 首先會對URL地址進行處理:返回blog
  • 獲取別名路由定義 NULL
  • 以資源路由blog為例 返回false
ThinkPHP檢測URL路由深度解析
檢測路由別名

在檢測路由別名中存在一個方法需要去在看一下

參數就是上圖中傳入的blog

ThinkPHP檢測URL路由深度解析
獲取別名路由定義

來到這個方法,首先要明確的事情就是此方法在類thinkphp/library/think/Route.php

并且此類使用了thinkroute下的所有類

這個方法就會把從檢測路由過來的blog然后會在Route類中的alias屬性里邊進行獲取,如果不存在則會返回NULL

這個別名的使用會在下文中提到

ThinkPHP檢測URL路由深度解析
獲取別名路由定義

來到檢測別名路由的最后return $item ? $item->check($request, $url) : false;也就是這行代碼,從上圖中就可以知道,這個item就是NULL

并且最終將這個NULL給返回回去。

檢測URL綁定:checkUrlBind

參數說明

  • $request : request類的實例
  • $url : 傳過來的 blog

在這個方法中只對下圖咔咔圈出來的地方進行詳解。

ThinkPHP檢測URL路由深度解析
檢測URL綁定

來到方法getBind讀取路由綁定,可以看到咔咔已經將傳入的參數打印出來了。

本方法是在thinkphp/library/think/route/Domain.php這個類里邊,還記得在設置路由規(guī)則的$This->group就是使用的這個類,不知道的可以去看路由文章的第一節(jié)。

同時在這個方法中會進行一次subDomain當前子域名的獲取。

在這個方法最終會返回www,主要看一下圈出來的第一個部分。

通過request類中的host方法來獲取當前域名,然后進行分割。

返回數據:array(1) { [0] =>n string(3) "www"n}

給子域名賦值:$this->subDomain

返回最終結果返回子域名 : www

ThinkPHP檢測URL路由深度解析
獲取當前子域名

接著就會返回到上層,在上層進行判斷獲取的當前子域名WWW。

一些是所有的判斷處理,第一個判斷肯定是不會成立的,因為只返回了www,并沒有.

下邊的判斷是根據路由綁定進行的判斷,這里只需要知道最總會返回NULL就可以了。

ThinkPHP檢測URL路由深度解析
進行的判斷

知道了在底層返回了NULL,所以在這里的判斷同樣也不會成立,所以最終給上層返回的結果就是false。

ThinkPHP檢測URL路由深度解析
檢測URL綁定

判斷路由參數

根據上圖執(zhí)行流程最終還是會返回到thinkphp/library/think/route/Domain.php這個方法check檢測域名路由。

然后開始進行判斷路由參數。

沒有路由參數跳過不執(zhí)行。

存在路由參數:執(zhí)行方法setRouteVars :設置路由變量 這個參數是在框架版本5.1.5以上才可以使用,由于咔咔使用的版本有點低,就不對其詳解了。

ThinkPHP檢測URL路由深度解析
檢測域名路由
ThinkPHP檢測URL路由深度解析
文檔

添加域名中間件

關于中間件這里也不對其進行解釋,因為后期會新開一篇文章來詳解,本文還是以路由為重點哈!

檢測分組路由

接著就會來到檢測域名路由的最后一個流程,執(zhí)行代碼return parent::check($request, $url, $completeMatch);

會跳轉到類文件:thinkphp/library/think/route/RuleGroup.php,因為Domain類是繼承RuleGroup這個類的。

參數說明

  • $request : request類的實例
  • $url : 傳過來的 blog
  • $completeMatch : 路由是否完全匹配

在這個方法中咔咔只會對這里的其中的一個流程進行詳解,也就是合并分組參數。

因為這個方法也是貫穿執(zhí)行流程的一條主線,其余的都是方法都是在進行檢測,判斷。

ThinkPHP檢測URL路由深度解析
合并分組參數

四、總結

關于路由用了倆篇文章還沒有結束,看了這么長時間的源碼也就是路由這塊是最復雜并且最難理解的。

其中的類是一環(huán)套一環(huán),路由先暫時了解到這里,后期在閱讀其它源碼時在進行其它內容補充。

在路由這一篇中主要執(zhí)行的流程圖大家一定要仔細看。

ThinkPHP檢測URL路由深度解析
執(zhí)行流程圖

在就是通過在注冊路由規(guī)則時的group這個屬性最終返回的是Domain類,這里的內容一定要清晰。

主要知道在路由中域名的配置流程,域名是在何時進行配置的。

路由文件中的返回數組和在導入路由文件流程要有清晰的思路。

再就是回顧之前學習的ArrayAccess,像訪問數組一樣訪問對象。

容器中的魔術方法__get方法,在這個魔術方法中存在make方法,主要用來返回一個類的實例,并且存放到容器中。

關于路由的方面暫時就說到這里的,預計在有一篇就會把路由寫完了。

堅持學習、堅持寫博、堅持分享是咔咔從業(yè)以來一直所秉持的信念。希望在諾大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲福利精品电影在线观看| 国产成人亚洲精品电影| 亚洲av永久无码精品网站| 精品国偷自产在线视频| 日韩成人av在线| 国产精品美女久久久久久久| 无码国产精品一区二区免费I6| 日本阿v精品视频在线观看| 99精品国产一区二区三区不卡| 精品一区二区三区中文字幕| 久久国产美女免费观看精品| 亚洲国产精品成人AV无码久久综合影院| 日韩人妻一区二区三区蜜桃视频| 国产精品亚洲五月天高清| 国产精品久久久久久一区二区三区 | 亚洲伊人精品综合在合线| 亚洲精品免费视频| 免费视频精品一区二区三区| 亚洲日韩国产精品第一页一区| CAOPORN国产精品免费视频| 精品国产亚洲一区二区在线观看 | 久久精品成人免费观看97| 国产69精品久久久久9999| 伊人久久精品影院| 青春草无码精品视频在线观| 日韩高清一级毛片| 亚洲欧美日韩国产精品一区| 亚洲日韩乱码中文无码蜜桃| 亚洲日韩在线视频| 日韩字幕一中文在线综合| 精品国产日韩一区三区| 日韩黄a级成人毛片| 亚洲国产日韩在线一区| 日韩AV无码久久一区二区| 中文字幕无码亚洲欧洲日韩| 日韩福利电影在线观看| 日韩精品视频观看| 一本之道av不卡精品| 亚洲精品A在线观看| 国产伦精品一区二区三区视频金莲| 国产乱人伦偷精品视频免观看|