久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

      ThinkPHP結(jié)尾篇路由調(diào)度

      一、解析匹配到的規(guī)則路由-路由地址動態(tài)處理

      在上文執(zhí)行完的過程中會發(fā)生幾種情況,咔咔這里給大家整理一下,由于寫的比較多怕有時候看的時候就混淆了。

      第一種情況

      沒有任何路由參數(shù)和路由規(guī)則,就單純的路由地址。

      ThinkPHP結(jié)尾篇路由調(diào)度
      單純的路由地址

      在這里打印一下檢測URL和規(guī)則路由是否匹配的返回結(jié)果,以下的幾種情況都使用的同一個地方打印,就不在寫第二次了。

      也就是當(dāng)路由地址為純路由地址時返回的是一個空數(shù)組。

      ThinkPHP結(jié)尾篇路由調(diào)度
      返回檢測URL和規(guī)則路由是否匹配結(jié)果
      ThinkPHP結(jié)尾篇路由調(diào)度
      打印結(jié)果

      第二種情況

      設(shè)置有路由參數(shù)并且是必選參數(shù),會返回參數(shù)和值并且是數(shù)組形式。

      ThinkPHP結(jié)尾篇路由調(diào)度
      設(shè)置有路由參數(shù)并且是必選參數(shù)
      ThinkPHP結(jié)尾篇路由調(diào)度
      返回檢測URL和規(guī)則路由是否匹配結(jié)果

      第三種情況

      設(shè)置有資源路由參數(shù)并且是必選參數(shù),會返回參數(shù)和值并且是數(shù)組形式,如果沒有參數(shù)則返回false。

      ThinkPHP結(jié)尾篇路由調(diào)度
      資源路由情況
      ThinkPHP結(jié)尾篇路由調(diào)度
      返回檢測URL和規(guī)則路由是否匹配結(jié)果

      接下來在進(jìn)入到本節(jié)的正題,為什么要做對以上的三種情況做出聲明,請看下圖咔咔圈出來的地方。

      以上三種情況的打印結(jié)果就是$match這個的值,所以當(dāng)$match值為false時整個流程會直接返回false。

      不會在去執(zhí)行解析匹配到的規(guī)則路由這一步驟。

      ThinkPHP結(jié)尾篇路由調(diào)度
      檢測路由

      在這里會執(zhí)行幾個動作,分別為

      • 檢查OPTIONS請求
      • 檢查前置行為
      • 解析匹配到的規(guī)則路由

      而且我們要學(xué)習(xí)的就是解析匹配到的規(guī)則路由這個里邊的內(nèi)容。

      使用以下路由作為案例進(jìn)行執(zhí)行流程。

      ThinkPHP結(jié)尾篇路由調(diào)度
      使用的路由做演示案例

      解析匹配到的規(guī)則路由

      參數(shù)說明

      • $request : object(thinkRequest) 請求類
      • $this->rule : string(13) "hello/<name?>" 路由規(guī)則
      • $this->route : string(17) "index/index/hello" 路由地址
      • $url : string(5) "hello" 請求地址
      • $option : array(1) { ["merge_rule_regex"] => bool(false)} 路由參數(shù)
      • $match : array(1) { ["name"] => string(1) "1"} 就是上邊三種情況返回的值

      執(zhí)行文件:thinkphp/library/think/route/RuleItem.php,行號202.

      ThinkPHP結(jié)尾篇路由調(diào)度
      解析匹配到的規(guī)則路由

      接著就會進(jìn)入到方法parseRule這個里邊,這個方法的功能就是解析匹配到的規(guī)則路由,參數(shù)就是咔咔上邊給寫出來的六個參數(shù)。

      由于路由參數(shù)是沒有設(shè)置的所以不會去執(zhí)行上邊的那部分,接下來會對圈起來的地方進(jìn)行深入的解析。

      在這里主要就是替換路由地址中的變量。

      ThinkPHP結(jié)尾篇路由調(diào)度
      解析匹配到的規(guī)則路由

      這里的route和match這倆個值在上邊的參數(shù)就已經(jīng)做出說明了,可以翻上去看一下。

      可以肯定的是肯定這個判斷肯定會進(jìn)行執(zhí)行。

      這里注意一下中間的部分,可以看到$replace$search執(zhí)行了倆次。其實就是針對路由規(guī)則后邊的地址進(jìn)行了倆種方案。

      路由規(guī)則后邊的參數(shù)是可選的,所以說這倆個值分別為以下,請看圖。

      ThinkPHP結(jié)尾篇路由調(diào)度
      參數(shù)一
      ThinkPHP結(jié)尾篇路由調(diào)度
      參數(shù)二

      然后通過str_replace() 函數(shù)替換字符串中的一些字符(區(qū)分大小寫)。

      最后返回的route就是string(17) "index/index/hello"

      接下來就是咔咔圈出來的地方,這塊主要就是運用PHP函數(shù)來對請求地址進(jìn)行的處理。

      這里有一個方法作用是解析URL地址中的參數(shù)Request對象,但是因為URL在這里是個空值所以不會去執(zhí)行。

      在將三個值進(jìn)行賦值,然后就開始執(zhí)行了路由調(diào)度。

      ThinkPHP結(jié)尾篇路由調(diào)度
      解析額外參數(shù)

      本節(jié)就簡單說到這里,在本節(jié)主要就是解析匹配到的規(guī)則路由,接下來就是進(jìn)行路由調(diào)度。

      路由調(diào)度是路由這塊的最后一個流程,也是連接控制器的一個點,接下來咔咔會對路由調(diào)度進(jìn)行詳細(xì)解析。

      續(xù)集

      解析匹配到的規(guī)則路由中存在這行代碼,在上文中沒有做出對應(yīng)情況說明,接下來對這種情況做出說明。

      ThinkPHP結(jié)尾篇路由調(diào)度
      解析代碼

      路由地址設(shè)置為如下。

      ThinkPHP結(jié)尾篇路由調(diào)度
      路由案例設(shè)置

      此時在來打印一下剛剛那塊的代碼查看一下變化,到底有什么作用。

      ThinkPHP結(jié)尾篇路由調(diào)度
      分別為倆個值$search和replace

      最后就是通過str_replace進(jìn)行替換的,所以并將參數(shù)換成hello。

      ThinkPHP結(jié)尾篇路由調(diào)度
      請求地址

      這里有一個非常重要的一個點就是關(guān)于str_replace這個函數(shù)的高級使用,平時都是用一個字符串替換另一個字符串,但是在本案例中是數(shù)組替換數(shù)組的方式。

      如果你之前沒有使用過這種方式,請自行搜索或者持續(xù)關(guān)注咔咔的發(fā)文,你會看到你想要的。

      二、路由調(diào)度

      在路由的這一節(jié)中這是咔咔最后講解的一個重點,路由調(diào)度。

      路由調(diào)度完就是控制器的執(zhí)行了,不是說路由設(shè)置完就可以直接訪問的。

      解析匹配到的規(guī)則路由的最后一步就會執(zhí)行路由調(diào)度。

      執(zhí)行文件 : thinkphp/library/think/route/Rule.php 763行.

      參數(shù)說明

      • $request : object(thinkRequest) 請求類
      • $route : string(17) "index/index/hello"
      • $option : array(1) { ["merge_rule_regex"] => bool(false)}
      ThinkPHP結(jié)尾篇路由調(diào)度
      發(fā)起路由調(diào)度

      那么就來到發(fā)起路由調(diào)度的方法來進(jìn)行深度解析。

      ThinkPHP結(jié)尾篇路由調(diào)度
      發(fā)起路由調(diào)度

      在這個方法中咔咔只對最常用的方式進(jìn)行解析了,其它的方式根據(jù)自己閱讀源碼的方式進(jìn)行閱讀即可。

      ThinkPHP結(jié)尾篇路由調(diào)度
      路由到模塊控制器操作

      來到解析URL地址為 模塊/控制器/操作中。

      ThinkPHP結(jié)尾篇路由調(diào)度
      解析URL地址為 模塊/控制器/操作

      關(guān)于這個list的使用在源碼中也出現(xiàn)了很多次了,咔咔將打印結(jié)果給大家展示出來。、

      打印的數(shù)據(jù)為$this->parseUrlPath($route);

      ThinkPHP結(jié)尾篇路由調(diào)度
      打印結(jié)果

      接下來在一張圖中進(jìn)行打印$path$var的值,你們就知道這個list是怎么使用的。

      從下圖中就可以看到list其實就是將數(shù)組的索引值賦值給list中的倆個變量而已。

      ThinkPHP結(jié)尾篇路由調(diào)度
      打印的倆個變量

      接下來就是獲取操作,控制器,模塊。

      函數(shù)array_pop就是返回數(shù)組的最后一組數(shù)據(jù)然后返回,在這里也就是返回的操作。

      控制器也是用同樣的操作。

      模塊是會在配置文件中獲取,最終也是通過array_pop來進(jìn)行獲取的。

      至于使用請求類來獲取請求方式,這個在后期會進(jìn)行解析,這里只需知道返回的是請求方式即可。

      最終的返回結(jié)果如下圖。

      ThinkPHP結(jié)尾篇路由調(diào)度
      路由到模塊/控制器/操作的返回結(jié)果

      在這里有一個問題,就是關(guān)于類的調(diào)用問題,跟這咔咔的節(jié)奏一點一點追蹤。

      ThinkPHP結(jié)尾篇路由調(diào)度
      解決最后一步的調(diào)用關(guān)系

      路由到模塊/控制器/操作類的調(diào)用關(guān)系

      追蹤這個函數(shù)第一步是進(jìn)入到了類thinkphp/library/think/route/Rule.php這里

      ThinkPHP結(jié)尾篇路由調(diào)度
      追蹤第一步

      然后在進(jìn)行追蹤Modul這個類。

      又因為這個類繼承著Dispatch這個類,所以還需要在繼續(xù)追蹤。

      ThinkPHP結(jié)尾篇路由調(diào)度
      追蹤第二步

      來到thinkphp/library/think/route/Dispatch.php就可以看到這個構(gòu)造函數(shù),到這里也就是最后一步了。

      ThinkPHP結(jié)尾篇路由調(diào)度
      thinkphp/library/think/route/Dispatch.php

      然后在通過本類thinkphp/library/think/route/Dispatch.php的init方法,返回本類,也就是上層打印出來的結(jié)果。

      ThinkPHP結(jié)尾篇路由調(diào)度
      返回本類

      在這里可以對這個返回結(jié)果做一個調(diào)試看一下結(jié)果。

      通過結(jié)果就知道最終就是從這里返回過去的。

      ThinkPHP結(jié)尾篇路由調(diào)度
      打印返回返結(jié)果
      ThinkPHP結(jié)尾篇路由調(diào)度
      返回結(jié)果

      三、路由調(diào)度的最終結(jié)果返回給了誰?

      路由調(diào)度的解析在這里就結(jié)束了,但是經(jīng)過了一層一層的深扒已經(jīng)進(jìn)入到了框架的最底層位置了。

      這個時候突然給返回了一個值,是不是有點懵,這是返回到哪里去了。

      根據(jù)咔咔畫的思維導(dǎo)圖先來捋一遍。

      • 路由到模塊/控制器/操作$this->dispatchModule
      • 發(fā)起路由調(diào)度$this->dispatch
      • 解析匹配到的規(guī)則路由return $this->parseRule
      • 執(zhí)行 $this->checkRule檢測路由
      • 執(zhí)行thinkrouteRuleItem Object 中的check
      • 檢查分組路由
      • 檢測分組路由 : parent::check
      • 檢測域名路由
      • 路由檢測: this->route->check(must);
      • 路由檢測 : $this->routeCheck()->init()

      所以說根據(jù)咔咔的導(dǎo)圖最開始的位置就是$this->routeCheck()->init()

      如果圖不清晰請及時在評論區(qū)見。

      ThinkPHP結(jié)尾篇路由調(diào)度
      路由執(zhí)行流程

      也就是返回到了下圖位置。

      ThinkPHP結(jié)尾篇路由調(diào)度
      app類

      然胡使用咔咔提供的神器來打印一下執(zhí)行流程。

      這里跟上邊那個無序列表時反向的,跟這個流程執(zhí)行也是一一致的。

      ThinkPHP結(jié)尾篇路由調(diào)度
      第一流程
      ThinkPHP結(jié)尾篇路由調(diào)度
      第二流程

      截止到這里關(guān)于路由的所有內(nèi)容就結(jié)束了,在路由這節(jié)有很多的內(nèi)容,也不會去全面的解讀,抓住要點進(jìn)行解析即可。

      總結(jié)

      ThinkPHP結(jié)尾篇路由調(diào)度
      路由執(zhí)行全流程

      在這一節(jié)中主要針對解析匹配到的規(guī)則路由-路由地址動態(tài)處理,主要就是針對不同的路由規(guī)則參數(shù),返回不同倆種結(jié)果。

      主要就是針對上文中的一種情況就是路由規(guī)則和路由地址都帶有參數(shù)時對參數(shù)進(jìn)行的處理。

      然后使用array_pop進(jìn)行獲取模塊控制器方法,最終執(zhí)行到路由調(diào)度。

      在路由調(diào)度后一定要清晰的知道關(guān)于返回值是返回給了哪里,對執(zhí)行的流程一定明確,可以根據(jù)咔咔給出的導(dǎo)圖,或者使用神器來打印也可以。

      路由源碼解析到這里就大結(jié)局了,從應(yīng)用初始化開始到路由調(diào)度返回值,這一個過程中有很多的過程,咔咔也僅僅是針對重要的進(jìn)行了解析。

      后期如有時間也會對其它情況進(jìn)行詳細(xì)的說明,路由這塊也是框架最復(fù)雜的一部分,希望可以好好進(jìn)行理解。

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