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

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

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

        前言

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

        本文會接著ThinkPHP路由源碼解析繼續(xù)講解,也是路由這塊內容的收尾了,后面會在有一篇關于路由調度這塊的內容就結束了,希望大家對路由有一個好的認識吧!

        關于路由,咔咔感覺是整個框架中源碼閱讀最吃力的一個核心點,也耗費了很多時間。

        因為在其中有很多類的嵌套,何不按照常理出牌,例如$this->group的這個點。

        雖然就是一個簡單的調用關系,但是在源碼中執(zhí)行的功能也是很多很多。

        一般源碼都會認為這個group就是簡單的一個類,其實不然,最終返回的結果令人有點匪夷所思返回的是Domain這個類。

        所以說對于框架的一切都需要認真的去理解,閱讀源碼主要是為了提升自己對框架的認識和框架的設計思想。

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

        后期的所有源碼閱讀都會直接添加到這里,進行補充。

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

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

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

        參數(shù)合并其實就是將路由參數(shù)和默認的參數(shù)進行合并。

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

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

        執(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();

        對應執(zhí)行關系:

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

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

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

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

        合并分組參數(shù)

        接下來先說這塊的內容。

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

        在看這一塊內容之前需要對$this->parent這個屬性進行查看,看這個值是設置成了什么。

        通過debug_backtrace()對其打印可以得知為Domain的實例化類。

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

        接下來就進入到mergeGroupOptions方法進行詳解。

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

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

        最終返回結果

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

        說到底就是將路由參數(shù)進行合并,路由參數(shù)官方支持的請看下圖,注意一下支持版本號。

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

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

        檢查分組路由

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

        在這里首先需要明確一下關于$rules這個變量的值是什么。

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

        打印出$rules的值可以看出來有倆種情況。

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

        第二種情況為資源路由。

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

        這是因為咔咔在路由文件只設置了倆個路由,一個資源路由,一個非資源路由。

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

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

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

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

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

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

        因為在resource類中繼承的是RuleGroup類。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国内精品九九久久久精品| 91麻豆精品视频在线观看| 久久亚洲私人国产精品| 97精品国产97久久久久久免费| 中文字幕乱码中文乱码51精品| 98香蕉草草视频在线精品看| 久久精品国产亚洲AV高清热| 久久久久亚洲精品天堂久久久久久| 精品一卡2卡三卡4卡免费视频| 老司机午夜精品视频资源| 免费精品国自产拍在线播放| 国产va免费精品| 国产精品久久影院| 99久久99这里只有免费费精品 | 午夜一级日韩精品制服诱惑我们这边| 精品国产美女福利到在线不卡| 国产亚洲精品a在线无码| 亚洲精品狼友在线播放| 亚洲国产精品专区在线观看| 精品亚洲视频在线观看| 国语自产精品视频| 国产精品亚洲mnbav网站| 大胸国产精品视频| 国产VA免费精品高清在线| 国产精品成人久久久久久久| 91探花国产综合在线精品| 亚洲国产精品国自产电影| 青青草国产精品久久久久| 日本精品卡一卡2卡3卡四卡| 亚洲国产精品久久久久久| 久久精品国产精品青草app| 精品亚洲永久免费精品| 日本一区精品久久久久影院| 亚洲无删减国产精品一区| 87国产私拍福利精品视频| 97视频在线精品国自产拍| 国产精品无码素人福利| 精品人妻少妇一区二区三区在线| 精品伦精品一区二区三区视频 | 国产精品视频一区二区三区无码| 亚洲欧洲久久久精品|