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

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

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配

    本文接著上文繼續(xù)來(lái)解讀路由源碼,如果你看到本文可以先看一下之前寫的路由文章,共計(jì)倆篇。

    前言

    經(jīng)過(guò)前倆篇路由源碼的解讀,相信大家對(duì)路由已經(jīng)有了一定了了解了。

    本文會(huì)接著ThinkPHP路由源碼解析繼續(xù)講解,也是路由這塊內(nèi)容的收尾了,后面會(huì)在有一篇關(guān)于路由調(diào)度這塊的內(nèi)容就結(jié)束了,希望大家對(duì)路由有一個(gè)好的認(rèn)識(shí)吧!

    關(guān)于路由,咔咔感覺是整個(gè)框架中源碼閱讀最吃力的一個(gè)核心點(diǎn),也耗費(fèi)了很多時(shí)間。

    因?yàn)樵谄渲杏泻芏囝惖那短?,何不按照常理出牌,例?this->group的這個(gè)點(diǎn)。

    雖然就是一個(gè)簡(jiǎn)單的調(diào)用關(guān)系,但是在源碼中執(zhí)行的功能也是很多很多。

    一般源碼都會(huì)認(rèn)為這個(gè)group就是簡(jiǎn)單的一個(gè)類,其實(shí)不然,最終返回的結(jié)果令人有點(diǎn)匪夷所思返回的是Domain這個(gè)類。

    所以說(shuō)對(duì)于框架的一切都需要認(rèn)真的去理解,閱讀源碼主要是為了提升自己對(duì)框架的認(rèn)識(shí)和框架的設(shè)計(jì)思想。

    還是按照步驟來(lái),先看礦機(jī)的執(zhí)行流程圖,然后大家就可以根據(jù)流程圖進(jìn)行清晰的閱讀文章了。

    后期的所有源碼閱讀都會(huì)直接添加到這里,進(jìn)行補(bǔ)充。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    框架執(zhí)行流程

    一、檢測(cè)路由-合并分組參數(shù)、檢查分組路由

    上一篇的最后是講的下圖的位置,這個(gè)位置暫時(shí)還是空的,這個(gè)空的位置就是接下來(lái)要講的合并分組參數(shù)。

    參數(shù)合并其實(shí)就是將路由參數(shù)和默認(rèn)的參數(shù)進(jìn)行合并。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    執(zhí)行位置

    為了能給大家清晰的展示出來(lái)執(zhí)行流程,咔咔將執(zhí)行流程圈了出來(lái)。

    執(zhí)行文件:

    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 -> $result = $this->checkRouteAlias($request, $url); -> return parent::check($request, $url, $completeMatch);
    4. thinkphp/library/think/route/RuleGroup.php -> $this->mergeGroupOptions();

    對(duì)應(yīng)執(zhí)行關(guān)系:

    1. 路由檢測(cè) 返回一個(gè)Dispatch對(duì)象
    2. 檢測(cè)域名路由
    3. 檢測(cè)別名路由 -> 檢測(cè)分組路由
    4. 合并分組參數(shù)
    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    路由檢測(cè)執(zhí)行流程

    可以看這一小節(jié)的標(biāo)題為檢測(cè)路由之路由參數(shù)、檢查分組路由,那么在檢測(cè)路由這里還是有很多的內(nèi)容的。

    只不過(guò)咔咔只是針對(duì)于合并分組參數(shù)、檢查分組路由進(jìn)行重點(diǎn)的講解,終于其它的內(nèi)容是沒有貫穿到整條線的,就不去做過(guò)深的探討了。

    下一篇文章在控制器中會(huì)聊到一部分,但也不是全部都會(huì)寫的哈!

    合并分組參數(shù)

    接下來(lái)先說(shuō)這塊的內(nèi)容。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    合并分組參數(shù)

    在看這一塊內(nèi)容之前需要對(duì)$this->parent這個(gè)屬性進(jìn)行查看,看這個(gè)值是設(shè)置成了什么。

    通過(guò)debug_backtrace()對(duì)其打印可以得知為Domain的實(shí)例化類。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    打印結(jié)果

    接下來(lái)就進(jìn)入到mergeGroupOptions方法進(jìn)行詳解。

    • 執(zhí)行的文件:thinkphp/library/think/route/RuleGroup.php 164行
    • $this->parent:class thinkrouteDomain
    • 獲取路由參數(shù)定義,如果不存在路由參數(shù)為'merge_rule_regex' => bool(false),反正會(huì)在后邊追加上路由參數(shù)
    • 合并分組參數(shù):$this->mergeOptions : 需要和分組合并的路由參數(shù)'after', 'model', 'header', 'response', 'append', 'middleware'
    • 通過(guò)array_merge進(jìn)行合并參數(shù)
    • 并將lockOption參數(shù)進(jìn)行鎖定
    • 并將合并的結(jié)果返回,最終返回結(jié)果$this->option

    返回結(jié)果看下圖ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配

    最終返回結(jié)果

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    返回結(jié)果

    說(shuō)到底就是將路由參數(shù)進(jìn)行合并,路由參數(shù)官方支持的請(qǐng)看下圖,注意一下支持版本號(hào)。

    一般情況下路由參數(shù)我們是不使用的,這里提出來(lái)就讓大家知道有這個(gè)東西即可,如果堅(jiān)持要用的話可以一定要把版本號(hào)看清楚,要不你會(huì)遇到很多麻煩。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    支持的路由參數(shù)

    檢查分組路由

    文件:thinkphp/library/think/route/RuleGroup.php 183行。

    在這里首先需要明確一下關(guān)于$rules這個(gè)變量的值是什么。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    檢測(cè)分組路由

    打印出$rules的值可以看出來(lái)有倆種情況。

    第一種情況為不是資源路由。

    第二種情況為資源路由。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    $rules的值

    這是因?yàn)檫沁窃诼酚晌募辉O(shè)置了倆個(gè)路由,一個(gè)資源路由,一個(gè)非資源路由。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    路由配置文件

    根據(jù)上圖圈出來(lái)的數(shù)據(jù)就可以知道當(dāng)執(zhí)行循環(huán)時(shí)$item這個(gè)值分為倆種情況。

    • 執(zhí)行thinkrouteResource Object中的check方法
    • 執(zhí)行thinkrouteRuleItem Object中的check方法

    根據(jù)神器的打印結(jié)果可以看到當(dāng)為資源路由時(shí) 也是執(zhí)行的thinkphp/library/think/route/RuleGroup.php類的check方法。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    神器打印

    為什么資源路由會(huì)執(zhí)行thinkphp/library/think/route/RuleGroup.php的check

    因?yàn)樵趓esource類中繼承的是RuleGroup類。

    并且$item的值是Resource類的實(shí)例,所以會(huì)進(jìn)行執(zhí)行check方法。

    所以說(shuō)擁有神器是多么的重要,關(guān)于這個(gè)神器在之前的文章進(jìn)行過(guò)深入的講解如何使用,如果你還不會(huì),或者不知道這個(gè)用法趕緊去看看哈!神器是可以直接打印出代碼的執(zhí)行流程,在調(diào)試源碼的過(guò)程中是非常有用的。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    繼承關(guān)系

    經(jīng)過(guò)再一次的執(zhí)行check方法,最終結(jié)果的返回是在下圖咔咔圈的地方。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    檢測(cè)路由分組

    非資源路由執(zhí)行check

    文件:thinkphp/library/think/route/RuleItem.php 行號(hào)231 此處就是非資源路由執(zhí)行的方法。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    非資源路由執(zhí)行的方法

    進(jìn)到檢測(cè)路由規(guī)則方法后,還是會(huì)合并路由參數(shù)。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    檢測(cè)路由

    關(guān)于合并路由參數(shù)的方法,在上邊已經(jīng)說(shuō)過(guò)了, 在這里就不多說(shuō)了。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    合并路由參數(shù)

    直到這里關(guān)于檢測(cè)路由下的合并分組參數(shù)和檢查分組路由就說(shuō)完了,思路不清晰的可以看思維導(dǎo)圖。

    二、檢測(cè)URL變量和規(guī)則路由是否匹配

    以下案例使用的正常路由,沒有使用資源路由做的案例,走的是文件thinkphp/library/think/route/RuleItem.php

    使用神器來(lái)打印一下數(shù)據(jù)。

    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    執(zhí)行流程
    ThinkPHP檢測(cè)URL變量和規(guī)則路由是否匹配
    執(zhí)行流程

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