亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    ThinkPHP檢測(cè)URL路由深度解析

    前言

    由于文章篇幅的原因,執(zhí)行在新開(kāi)一篇文章進(jìn)行寫(xiě)。

    在上一篇中給大家講解了以下內(nèi)容。

    • 路由初識(shí)化簡(jiǎn)單分析
    • 通過(guò)定義路由再談門(mén)面
    • 路由定義rule方法中的$this->group到底執(zhí)行了什么
    • 路由規(guī)則預(yù)處理
    • 解析生成路由標(biāo)識(shí)的快捷訪(fǎng)問(wèn)

    但是在路由這塊還有很多的內(nèi)容要來(lái)講解,接下來(lái)就會(huì)針對(duì)以下內(nèi)容進(jìn)行解析。

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

    接下來(lái)就一個(gè)一個(gè)進(jìn)行詳解。

    同樣給大家放一個(gè)關(guān)于路由的執(zhí)行圖,供大家進(jìn)行參考。

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

    一、dispatch初認(rèn)識(shí)以及route-check 檢測(cè)URL路由

    這塊的內(nèi)容是在執(zhí)行應(yīng)用程序里邊,接下來(lái)咔咔帶大家簡(jiǎn)單的認(rèn)識(shí)一下。

    本節(jié)沒(méi)有源碼的解釋?zhuān)皇菫榱撕笪淖亯|使用的,所以很有必要知道dispatch是怎么一個(gè)回事。

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

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

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

    路由測(cè)試使用如下圖

    ThinkPHP檢測(cè)URL路由深度解析
    路由測(cè)試使用案例

    然后我們可以對(duì)這個(gè)調(diào)度信息進(jìn)行打印

    ThinkPHP檢測(cè)URL路由深度解析
    打印數(shù)據(jù)
    ThinkPHP檢測(cè)URL路由深度解析
    打印結(jié)果

    在上圖中已經(jīng)打印出了關(guān)于dispatch的相關(guān)的值

    接下來(lái)就會(huì)針對(duì)routeCheck方法進(jìn)行簡(jiǎn)單的預(yù)覽

    ThinkPHP檢測(cè)URL路由深度解析
    routeCheck

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

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

    route-check 檢測(cè)URL路由

    但是這塊的內(nèi)容還是需要簡(jiǎn)單的去看一下的。

    在看之前需要明確一下傳入的倆個(gè)參數(shù)分別是什么。

    參數(shù)一:路由規(guī)則 參數(shù)二:檢測(cè)是否配置了強(qiáng)制路由

    ThinkPHP檢測(cè)URL路由深度解析
    返回一個(gè)dispatch對(duì)象

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

    ThinkPHP檢測(cè)URL路由深度解析
    檢測(cè)url路由

    在這個(gè)方法中關(guān)于自動(dòng)檢測(cè)域名路由我們來(lái)打印一下數(shù)據(jù)是什么樣的。

    其實(shí)這個(gè)返回的結(jié)果就是跟之前資源路由掛載的方式是一樣的,

    ThinkPHP檢測(cè)URL路由深度解析
    打印結(jié)果

    然后會(huì)通過(guò)pathinfo分隔符 : 把url中的 / 改為 |

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

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

    這里邊的細(xì)節(jié)就不去深度解析了,關(guān)于路由這塊的細(xì)節(jié)是在是太多了,如果一個(gè)一個(gè)去針對(duì)細(xì)節(jié),那是需要耗費(fèi)大量的時(shí)間的。

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

    二、request類(lèi)是如何找到的

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

    這里不去關(guān)心這個(gè)方法執(zhí)行了什么。

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

    首先可以看到的是在Route類(lèi)中是存在request這個(gè)屬性的。

    ThinkPHP檢測(cè)URL路由深度解析
    請(qǐng)求對(duì)象的屬性

    接著來(lái)到Route的構(gòu)造函數(shù),在這里你會(huì)發(fā)現(xiàn)新天地。

    此處使用了ArrayAccess像數(shù)組一樣訪(fǎng)問(wèn)對(duì)象,但是$app中不存在request屬性,所以就會(huì)去執(zhí)行容器類(lèi)中的__get魔術(shù)方法,在__get方法中調(diào)用的是容器中的make方法,第一個(gè)參數(shù)為request,最終會(huì)返回request的實(shí)例。

    ThinkPHP檢測(cè)URL路由深度解析
    構(gòu)造函數(shù)

    這里的$app其實(shí)就是通過(guò)依賴(lài)注入進(jìn)來(lái)的App實(shí)例。

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

    在容器類(lèi)中得最下邊會(huì)有幾個(gè)魔術(shù)方法。

    這里只需要關(guān)注__get方法即可。

    ThinkPHP檢測(cè)URL路由深度解析
    魔術(shù)方法

    __get方法會(huì)在訪(fǎng)問(wèn)不存在的屬性時(shí)會(huì)執(zhí)行的函數(shù)。

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

    ThinkPHP檢測(cè)URL路由深度解析
    容器類(lèi)中的make方法

    這個(gè)方法會(huì)通過(guò)一系列的操作,最終返回一個(gè)Request的實(shí)例。

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

    關(guān)于容器類(lèi)中的make方法是容器類(lèi)中特別重要的方法,也是靈魂方法。

    全框架的實(shí)例都是通過(guò)容器返回的,所以說(shuō)這個(gè)方法的重要性就不用咔咔在多說(shuō)了。

    咔咔之前對(duì)容器進(jìn)行過(guò)特別深入的理解,并且用文章的形式呈現(xiàn)給了大家。

    三、檢測(cè)域名路由

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

    ThinkPHP檢測(cè)URL路由深度解析
    路由域名檢測(cè)流程圖

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

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

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

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

    先看注釋?zhuān)瑢?duì)這個(gè)方法的解釋就是URL路由檢測(cè)。

    在這個(gè)方法里邊先是會(huì)對(duì)路由緩存進(jìn)行檢測(cè),這塊內(nèi)容就是關(guān)于Cache的。

    在這個(gè)方法里邊最重要的的就是路由檢測(cè) 返回一個(gè)Dispatch對(duì)象就是這個(gè)方法。

    ThinkPHP檢測(cè)URL路由深度解析
    URL路由檢測(cè)

    那么接下里就是看這個(gè)方法。

    首先要明確的就是傳進(jìn)去的倆個(gè)參數(shù)都是什么。

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

    在檢測(cè)URL路由中會(huì)做以下幾件事情。

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

    接下來(lái)就只需要對(duì)檢測(cè)域名路由流程進(jìn)行深度解析。

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

    ThinkPHP檢測(cè)URL路由深度解析
    檢測(cè)URL路由

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

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

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

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

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

    檢測(cè)路由別名 : checkRouteAlias

    參數(shù)解釋

    • $request : request類(lèi)的實(shí)例
    • $url : 傳過(guò)來(lái)的 blog

    在這個(gè)方法里邊存在倆個(gè)需要明確的知識(shí)點(diǎn)

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

    在檢測(cè)路由別名中存在一個(gè)方法需要去在看一下

    參數(shù)就是上圖中傳入的blog

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

    來(lái)到這個(gè)方法,首先要明確的事情就是此方法在類(lèi)thinkphp/library/think/Route.php

    并且此類(lèi)使用了thinkroute下的所有類(lèi)

    這個(gè)方法就會(huì)把從檢測(cè)路由過(guò)來(lái)的blog然后會(huì)在Route類(lèi)中的alias屬性里邊進(jìn)行獲取,如果不存在則會(huì)返回NULL

    這個(gè)別名的使用會(huì)在下文中提到

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

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

    并且最終將這個(gè)NULL給返回回去。

    檢測(cè)URL綁定:checkUrlBind

    參數(shù)說(shuō)明

    • $request : request類(lèi)的實(shí)例
    • $url : 傳過(guò)來(lái)的 blog

    在這個(gè)方法中只對(duì)下圖咔咔圈出來(lái)的地方進(jìn)行詳解。

    ThinkPHP檢測(cè)URL路由深度解析
    檢測(cè)URL綁定

    來(lái)到方法getBind讀取路由綁定,可以看到咔咔已經(jīng)將傳入的參數(shù)打印出來(lái)了。

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

    同時(shí)在這個(gè)方法中會(huì)進(jìn)行一次subDomain當(dāng)前子域名的獲取。

    在這個(gè)方法最終會(huì)返回www,主要看一下圈出來(lái)的第一個(gè)部分。

    通過(guò)request類(lèi)中的host方法來(lái)獲取當(dāng)前域名,然后進(jìn)行分割。

    返回?cái)?shù)據(jù):array(1) { [0] =>n string(3) "www"n}

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

    返回最終結(jié)果返回子域名 : www

    ThinkPHP檢測(cè)URL路由深度解析
    獲取當(dāng)前子域名

    接著就會(huì)返回到上層,在上層進(jìn)行判斷獲取的當(dāng)前子域名WWW。

    一些是所有的判斷處理,第一個(gè)判斷肯定是不會(huì)成立的,因?yàn)橹环祷亓藈ww,并沒(méi)有.

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

    ThinkPHP檢測(cè)URL路由深度解析
    進(jìn)行的判斷

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

    ThinkPHP檢測(cè)URL路由深度解析
    檢測(cè)URL綁定

    判斷路由參數(shù)

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

    然后開(kāi)始進(jìn)行判斷路由參數(shù)。

    沒(méi)有路由參數(shù)跳過(guò)不執(zhí)行。

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

    ThinkPHP檢測(cè)URL路由深度解析
    檢測(cè)域名路由
    ThinkPHP檢測(cè)URL路由深度解析
    文檔

    添加域名中間件

    關(guān)于中間件這里也不對(duì)其進(jìn)行解釋?zhuān)驗(yàn)楹笃跁?huì)新開(kāi)一篇文章來(lái)詳解,本文還是以路由為重點(diǎn)哈!

    檢測(cè)分組路由

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

    會(huì)跳轉(zhuǎn)到類(lèi)文件:thinkphp/library/think/route/RuleGroup.php,因?yàn)镈omain類(lèi)是繼承RuleGroup這個(gè)類(lèi)的。

    參數(shù)說(shuō)明

    • $request : request類(lèi)的實(shí)例
    • $url : 傳過(guò)來(lái)的 blog
    • $completeMatch : 路由是否完全匹配

    在這個(gè)方法中咔咔只會(huì)對(duì)這里的其中的一個(gè)流程進(jìn)行詳解,也就是合并分組參數(shù)。

    因?yàn)檫@個(gè)方法也是貫穿執(zhí)行流程的一條主線(xiàn),其余的都是方法都是在進(jìn)行檢測(cè),判斷。

    ThinkPHP檢測(cè)URL路由深度解析
    合并分組參數(shù)

    四、總結(jié)

    關(guān)于路由用了倆篇文章還沒(méi)有結(jié)束,看了這么長(zhǎng)時(shí)間的源碼也就是路由這塊是最復(fù)雜并且最難理解的。

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

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

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

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

    主要知道在路由中域名的配置流程,域名是在何時(shí)進(jìn)行配置的。

    路由文件中的返回?cái)?shù)組和在導(dǎo)入路由文件流程要有清晰的思路。

    再就是回顧之前學(xué)習(xí)的ArrayAccess,像訪(fǎng)問(wèn)數(shù)組一樣訪(fǎng)問(wèn)對(duì)象。

    容器中的魔術(shù)方法__get方法,在這個(gè)魔術(shù)方法中存在make方法,主要用來(lái)返回一個(gè)類(lèi)的實(shí)例,并且存放到容器中。

    關(guān)于路由的方面暫時(shí)就說(shuō)到這里的,預(yù)計(jì)在有一篇就會(huì)把路由寫(xiě)完了。

    堅(jiān)持學(xué)習(xí)、堅(jiān)持寫(xiě)博、堅(jiān)持分享是咔咔從業(yè)以來(lái)一直所秉持的信念。希望在諾大互聯(lián)網(wǎng)中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見(jiàn)。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)