成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

illuminate/routing 源碼分析之注冊(cè)路由

seal_de / 3417人閱讀

摘要:本文將會(huì)源碼分析下是如何把開發(fā)者在中寫的路由列表注冊(cè)到對(duì)象內(nèi)的。通過以上的分析,就能對(duì)路由系統(tǒng)的基本設(shè)計(jì)越來越清晰。一個(gè)進(jìn)來后,首先開始啟動(dòng)并按照以上邏輯開始注冊(cè)路由列表,然后就是根據(jù)當(dāng)前信息查找對(duì)應(yīng)的對(duì)象。

我們知道,在 Laravel 世界里,外界傳進(jìn)來一個(gè) Request 時(shí),會(huì)被 Kernel 處理并返回給外界一個(gè) Response。Kernel 在處理 Request 時(shí),會(huì)調(diào)用 illuminate/routing 包提供的路由功能,來根據(jù)當(dāng)前的 Request,轉(zhuǎn)發(fā)到對(duì)應(yīng)的執(zhí)行邏輯(執(zhí)行邏輯的形式可以為 Closure 或 Controller@Action)。同時(shí),在進(jìn)入執(zhí)行邏輯之前和之后,還會(huì)依次進(jìn)入 Middlewares 的前置和后置處理。所以,一個(gè) Request 由 Kernel 處理為一個(gè) Response 的一個(gè)生命周期圖如下:

根據(jù)上面的流程,理解路由系統(tǒng)的內(nèi)部工作原理是非常重要的!當(dāng)然,它也是非常復(fù)雜的。想要深入理解一個(gè)工具的使用,學(xué)習(xí)它的內(nèi)部設(shè)計(jì)原理才是畫龍點(diǎn)睛。在理解 illuminate/routing 如何工作之前,先設(shè)想如何去設(shè)計(jì)一個(gè)路由系統(tǒng)呢?一起想個(gè)三分鐘吧。

注冊(cè)路由 :想想一個(gè) Request 進(jìn)入程序時(shí),攜帶的請(qǐng)求信息類似為 GET https://localhost/api/v2/peop...,所以我們需要定義一個(gè) Route 對(duì)象來表示這個(gè)信息,同時(shí)還得定義 RouteCollection(Route 的集合)來添加、獲取和匹配出一個(gè) Route。程序啟動(dòng)時(shí),開發(fā)者定義的所有路由(Route)列表都會(huì)被注冊(cè)到 RouteCollection 內(nèi)。

查找路由 :有了整個(gè)程序的路由列表,這樣當(dāng)一個(gè) Request 進(jìn)來時(shí),再根據(jù)當(dāng)前 Request 的信息匹配出一個(gè)合適的 Route,所以可以設(shè)計(jì)一個(gè)類似 RouterManager 對(duì)象,作用類似開發(fā)經(jīng)理 Manager 的總體統(tǒng)籌,來調(diào)用 $router->findRoute($request): Route 匹配出合適的 Route。

運(yùn)行路由 :既然匹配出了對(duì)應(yīng) Route,那可以調(diào)用 RouterManager->runRoute($route): Response 得到對(duì)應(yīng)的 Response 返回給外界。

所以,如果自己去設(shè)計(jì)一個(gè)路由系統(tǒng),就可以按照上面三步去做,思路也很好理解。實(shí)際上,Laravel 的路由模塊 illuminate/routing 也是按照這三個(gè)步驟來設(shè)計(jì)的。本文將會(huì)源碼分析下 Laravel 是如何把開發(fā)者在 routes/*.php 中寫的路由列表注冊(cè)到 RouteCollection 對(duì)象內(nèi)的。

我們知道,Laravel 在啟動(dòng)時(shí)第一步會(huì)去實(shí)例化 IlluminateFoundationApplication 對(duì)象,這個(gè)容器對(duì)象會(huì)去調(diào)用 IlluminateRoutingRoutingServiceProvider::register() 往容器對(duì)象的 $bindings 數(shù)組屬性key-value 形式注冊(cè)進(jìn)來,注冊(cè)的對(duì)象主要包括 Router(就是上文的 RouterManager 角色,把它比作為開發(fā)小組的開發(fā)經(jīng)理角色)等。

然后會(huì)去調(diào)用 AppProvidersRouteServiceProvider::boot() 方法默認(rèn)加載 routes/api.php 和 routes/web.php 文件中注冊(cè)的路由列表,并且以 Facade 模式去注冊(cè)路由列表:

Route::prefix($prefix)->middleware($middleware)->group("xxx/web.php");

實(shí)際上就是調(diào)用 IlluminateRoutingRouteRegistrar 類里的 attribute(key, value) 方法以 key-value 形式注冊(cè)到 attributes 數(shù)組屬性里。最主要的 group(string) 方法調(diào)用的是 Router::group() 方法,然后調(diào)用 loadRoutes(routes) 去執(zhí)行在 routes/api.php 和 routes/web.php 文件中定義的路由。對(duì)于每一種方法(如 GET、POST 等等方法)的路由,Router 對(duì)象內(nèi)都有對(duì)應(yīng)的方法來添加 Route 注冊(cè)到 RouteCollection 中,比如常見的 get(uri, action) 方法,就是調(diào)用的 RouteCollection::add(route) 方法把 Route 注冊(cè)到 RouteCollection 中。而 route 的創(chuàng)建,調(diào)用的是 Router::createRoute(methods, uri, action),其中由于 $action 可能是 Closure 或者 Controller@Action,如果是 Controller@Action 形式,則需要把字符串切割為數(shù)組形式,再傳入 Route 類的構(gòu)造函數(shù)里。

總結(jié)下注冊(cè)路由所需要用到的對(duì)象:使用 Route 來表示路由信息,使用 RouteCollection 來表示路由集合列表,并且提供了添加刪除方法來把 Route 注冊(cè)到 RouteCollection 內(nèi),而 Router 才是縱覽全局的角色,注冊(cè)路由是通過該對(duì)象發(fā)起的,它會(huì)調(diào)用 RouteCollection 去注冊(cè)路由,路由的元數(shù)據(jù)信息如路由名稱等是用 RouteRegistrar 對(duì)象表示。從上文可知道,所有對(duì)象中,Router 才是畫龍點(diǎn)睛的對(duì)象。

通過以上的分析,就能對(duì) illuminate/routing 路由系統(tǒng)的基本設(shè)計(jì)越來越清晰。一個(gè) Request 進(jìn)來后,Application 首先開始啟動(dòng)并按照以上邏輯開始注冊(cè)路由列表,然后就是根據(jù)當(dāng)前 Request 信息查找對(duì)應(yīng)的 Route 對(duì)象。

那如何根據(jù)當(dāng)前 Request 信息查找出對(duì)應(yīng)的 Route 的呢?見本系列第二篇文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29159.html

相關(guān)文章

  • Laravel中你為什么可以直接在 web.php 中 直接使用 Route ? 服務(wù)提供者的介紹

    摘要:這篇文章來自一個(gè)社區(qū)問題的思考中為什么可以直接使用原理很簡(jiǎn)單首先你注意一下里面 這篇文章來自一個(gè) sf 社區(qū)問題的思考 laravel web.php 中 Route 為什么可以直接使用 原理很簡(jiǎn)單 1 . 首先, 你注意一下 /config/app.php 里面 /* |----------------------------------------------------...

    desdik 評(píng)論0 收藏0
  • laravel auth 認(rèn)證

    摘要:如果兩個(gè)經(jīng)哈希運(yùn)算的密碼相匹配那么將會(huì)為這個(gè)用戶開啟一個(gè)認(rèn)證。如果認(rèn)證成功的話方法將會(huì)返回。重定向器上的方法將用戶重定向到登錄之前用戶想要訪問的,在目標(biāo)無效的情況下回退將會(huì)傳遞給該方法。最后如有錯(cuò)誤,歡迎指出交流群 Auth認(rèn)證 路由 從路由開始,找到源碼,再進(jìn)行研究找到根目錄下面的 vendor/laravel/framework/src/Illuminate/Routing/Rou...

    Lionad-Morotar 評(píng)論0 收藏0
  • laravel Route::controller 使用路由命名

    摘要:我們知道,在中使用的話,只需要綁定模型,在創(chuàng)建表單,鏈接時(shí),直接可以拿來用,不需要單獨(dú)的去給路由別名如創(chuàng)建鏈接但是我們使用時(shí),在創(chuàng)建鏈接,嘗試用以上方法訪問時(shí),就會(huì)報(bào)錯(cuò)如創(chuàng)建鏈接拋出路由不存在的錯(cuò)誤那我們?nèi)绾蜗袷褂靡粯臃奖愕膩硎褂媚睾芎?jiǎn)單, 我們知道,在 laravel 中使用 resource 的話,只需要綁定模型,在創(chuàng)建表單,鏈接時(shí),直接可以拿來用,不需要單獨(dú)的去給路由 as 別名...

    tracymac7 評(píng)論0 收藏0
  • Laravel 5.5 升級(jí)到 5.5.42 后遇到的 Cookie 序列化問題

    摘要:查閱官方文檔后得知,新版為了防止對(duì)象的序列化反序列化漏洞被利用,不再對(duì)值進(jìn)行自動(dòng)的序列化和反序列化處理。舉個(gè)栗子更新到后,因?yàn)椴辉僮詣?dòng)對(duì)值進(jìn)行序列化處理,而只能加密字符串?dāng)?shù)據(jù),這個(gè)時(shí)候程序就會(huì)拋出錯(cuò)誤。 最近手殘升級(jí)了項(xiàng)目里 Laravel 的小版本號(hào)(v5.5.39 => v5.5.45),這不升級(jí)則已,一升級(jí)就出了問題! Sentry 平臺(tái)上提示錯(cuò)誤:openssl_encrypt...

    jollywing 評(píng)論0 收藏0
  • Laravel 依賴注入源碼解析

    在 Laravel 的控制器的構(gòu)造方法或者成員方法,都可以通過類型約束的方式使用依賴注入,如: public function store(Request $request) { //TODO } 這里 $request 參數(shù)就使用了類型約束,Request 是類型約束的類型,它是一個(gè)類:IlluminateHttpRequest. 本文研究 Laravel 的依賴注入原理,為什么這樣定義...

    Donne 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<