五分鐘導覽與學習Laravel
一個Request的生命之旅與一個空空的腦袋
見樹不見林?
我發現要教會新手學習Laravel總少了一個概覽性的介紹,於是畫了一張圖盡量涵蓋了所有重要的主題,讓大家可以一目瞭然,而不會迷失在技術文件中。
從一個Request的生命之旅
既然Laravel是web application framework,我們從client端發送一個request到Laravel server開始,去認識每個關鍵元件,應該是最直覺的作法了,我在下圖中把request到response的過程它拆解成幾個步驟,依序經過Laravel中的關鍵元件:
- 所有的request都會先進到index.php裡,再進入middleware。
- middleware是Laravel用來過濾request的角色,包括了身份認證、請求次數限制等等。
- 通過middleware的request會進入到route中,route會判斷這個request要交給哪個controller處理,所以route對開發者來說最重要的工作就是定義路由規則。
- controller作為model與view之間的溝通橋樑,會根據request的要求向model要資料。
- model負責資料庫操作或業務邏輯,例如查詢註冊會員。
- 當controller取得model回傳的資料後會傳給view去做呈現,Laravel用blade樣版引擎把資料包裝成HTML格式的網頁;如果client端是API請求的話,則可能用JSON或其他格式回傳結果。
從request的生命週期我們可以認識Laravel的基礎組件,我們把它對應到官方文件上
- Requests:學習Laravel怎麼處理Request。
- Routing:學習Laravel怎麼處理路由。
- Middleware:學習Laravel怎麼過濾Request。
- Model、Views、Controllers:學習Laravel的MVC框架。
- Responses:學習Laravel如何回傳結果。
這裡我們已經拼湊出Laravel的基礎知識了,接著必須深入去了解實作細節,像是Middeware在過濾request時,身份驗證就是一個重要的任務(例如沒有管理員資格的會員禁止進到後台管理介面),每個關鍵元件都有需要學習的實作細節,包括如何驗證使用者的身份(Authorization)、Email認證(Email Verification)、Laravel的session機制(Session)等等,未來有機會再說明這些比較零碎的章節。
Laravel其實是一個空空的腦袋
而Laravel的service provider通常也是困惑新手的地方,我一樣畫了一張圖去說明,基於request的生命週期,我在右邊多加一張framwork的初始化流程:
從途中我們可以看到,其實在request進入到index.php時,Laravel需要初始化整個應用程式(步驟A),完成初始化後才會開始處理request(步驟H)。
而Laravel應用程式本身就是一個服務容器(Service Container),而服務容器是什麼呢?技術用語是注入依賴容器(Dependency Injection Container),不理解的人可以Google一下,或者先暫時略過這個技術名詞,簡單把服務容器當成一個空空的腦袋,Laravel初始化的過程就是在這個空空的腦袋裡灌入各種知識,讓他有辦法處理用戶的各種要求(request)。
參考上圖右側,我們深入解釋初始化的過程(步驟A~H):
A.這個空空的腦袋一開始會需要一些基礎知識,於是先把HTTP/Console Kernel和Exception Handler這些基礎知識注入到容器裡,有了Exception Handler之後,Laravel會知道要怎麼處理例外。
B.而有了HTTP/Console Kernel後,Laravel會得到路由、Middlewarre等等這些更強大的功能,一開始HTTP Kernel會去讀一個設定檔(.env)這個設定檔紀錄了資料庫連線資訊、應用程式是上線環境還是開發環境等等的,所以官方文件中頭幾節的主題(Configuration)就是要我們去設定這個.env檔。
C.接著HTTP Kernel基於這些設定檔去設置整個應用程式還有一些初始化framework的相關任務。
D.在request的生命週期中提到的middleware,其實是一個列表被紀錄在app/Http/Kernel.php中,HTTP Kernel會去讀取這張列表,取得所有的定義,因此我們客製化的Middleware也需要加在這張列表中。
E.讀取Middleware列表後,HTTP Kernel會負責定義Middeware,讓request能找到對應的Middeware。
F.接著HTTP Kernel會讀取config/app.php中的providers列表,provider紀錄所有的服務提供者(service provider),服務提供者(service provider)是什麼呢?前面我們說Laravel是一個空空的腦袋,所以我們可以把服務提供者當成一個老師,負責讓腦袋空空的Laravel學會新的技能。而Laravel提供了一個機制讓我們設計自己的service provider,使得Laravel得以擴充客製化的功能或服務,這些service provider必須紀錄在config/app.php中。
G.我們會發現providers這張列表包括了驗證(Auth)、視圖(View)、路由(Route)等剛剛生命週期中提到的一些元件,取得providers清單後,HTTP Kernel會將這些service全部注入到服務容器中,至此Laravel已經學會既有的核心服務和所有客製化的服務了。
H.Laravel透過服務容器來處理request,整個過程就是左側的request生命週期。