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

資訊專欄INFORMATION COLUMN

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

seal_de / 3393人閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29159.html

相關文章

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

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

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

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

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

    摘要:我們知道,在中使用的話,只需要綁定模型,在創建表單,鏈接時,直接可以拿來用,不需要單獨的去給路由別名如創建鏈接但是我們使用時,在創建鏈接,嘗試用以上方法訪問時,就會報錯如創建鏈接拋出路由不存在的錯誤那我們如何像使用一樣方便的來使用呢很簡單, 我們知道,在 laravel 中使用 resource 的話,只需要綁定模型,在創建表單,鏈接時,直接可以拿來用,不需要單獨的去給路由 as 別名...

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

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

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

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

    Donne 評論0 收藏0

發表評論

0條評論

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