分配工作:Routing/Router.php

與routing相關的一切都透過此Router類別完成。
由於Laravel支援的routing方式非常多元,除了常見的對應到closure、對應到特定controller的特定函式,還支援了route filters、route groups等功能。所以,要看懂全部source code,需要先瞭解Laravel提供了哪些豐富的routing方法:Routing

建構式會將$events存下、$app存為$container(???)
路徑組的對應是由Symfony的RouteCollection類別負責。
Router實作上的核心功能是由Symfony的RouteCollection與Route類別完成。

以上get, post, put, patch, delete, options, any, match函式,都只是呼叫addRoute新增一個route。
使用Laravel時,撰寫的route規則就是在呼叫這些函式:Routing
若是好奇背後的呼叫原理,請參見:讓你少打很多字:Facades。

addRoute就是在$this->routes這個RouteCollection實體內add一個Route實體而已。

先用routingToController判斷$action到底是一個可呼叫的callback,還是代表了controller的字串。
如果是代表了controller的字串,???
createRoute會去呼叫newRoute來初始化一個route。

newRoute只是呼叫Route建構式然後回傳而已。

除了呼叫建構式,什麼都沒做。
一定要多寫這個newRoute給createRoute呼叫嗎?createRoute不能直接呼叫建構式嗎?
我覺得多此一舉。

判斷是否為代表controller的route字串。

回傳Boolean的函式通常命名以is開頭較好。
譬如isRoutedToController。

$action要嘛是代表controller的字串,要嘛是一個有’uses’索引的陣列。
若是前者的形式,統一把它轉成後者的形式。

然後…???

實際上負責分配任務的函式。
先紀錄本次$request。接著檢查有沒有針對此request登記預先處理的動作(沒有的話,callFilter會回傳null)。
若before的動作結束還沒得到response,則dispatchToRoute會去找對應的Controller之類的去處理。
prepareResponse會將$response調整、使其符合RFC 2616的規範。
最後檢查有沒有針對此request登記後續處理的動作。

注意此函式內的動作跟dispatch極度雷同。差別在於一個是global filter、一個是local filter(差別何在???)

$route->run的參數$request是多餘的。
前面的$route = $this->findRoute($request) 已經是傳入$request得到的結果,此處不必再傳一次。
事實上,run函式本身的定義根本沒有傳入參數。
參見:執行工作:Routing/Route.php

這不是單純根據$request去找到對應$route的函式。
它同時會更新$this->current變數、用substituteBindings更新$route才回傳。

若是命名為findAndSetRoute會不會更清楚?

by 阿川先生

有技術問題想要找人討論嗎?

歡迎前往我開發的 Devs.tw 程式設計討論區

一起來討論技術問題、分享技術筆記、文章吧!

前往逛逛:https://devs.tw