国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

illuminate/routing 源碼分析之注冊路由

seal_de / 3399人閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29159.html

相關(guān)文章

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

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

    desdik 評論0 收藏0
  • laravel auth 認證

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

    Lionad-Morotar 評論0 收藏0
  • laravel Route::controller 使用路由命名

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

    tracymac7 評論0 收藏0
  • Laravel 5.5 升級到 5.5.42 后遇到的 Cookie 序列化問題

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

    jollywing 評論0 收藏0
  • Laravel 依賴注入源碼解析

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

    Donne 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<