先前幾篇文章都在探討 ProductResource::make() 的 make()
的作用,這篇文章講解 『class ProductResource 的 toArray()』 怎麼被觸發的過程,過程猶如行徑 Laravel Request Lifecycle 請求的生命週期。
request 怎麼變成 Response 的過程,推薦 Laravel Request Lifecycle 請求的生命週期
一文,裡面的內容和圖片解說,很讚!
經作者同意,我引用文章中的 『Laravel Request Lifecycle 請求的生命週期』,如圖:
handle()
handle()
,往 class Kernel 的父層 (class HttpKernel)
handle()
,發現 $response 透過 sendRequestThroughRouter($request)
產生sendRequestThroughRouter($request)
做什麼事? 經過 middleware 然後 dispatchToRouter()
dispatchToRouter()
追$this->router
的 dispatch(),這個 $this->router
在 class HttpKernel __contruct() type hint 顯示是 class Router
dispatch()
dispatch()
,要前往下一個 method dispatchToRoute($request)
runRoute()
,略過 findRoute()
,runRoute()
如:prepareResponse()
toResponse()
: request 轉換為 response 的過程,種種的判斷式都在 toResponse()
內。Responseable
很眼熟啊! Responseable 經常在 JsonResource 出現,咱們來去 JsonResource 看看從第四站 開始,我會把前面幾篇文章提到的 class ProductResource
帶入討論 (ps. class ProductResource
是 class JsonResource
的 子類別)
因此,從 class JsonResource
的 toResponse()
開始著手
class JsonResource
,然而,在 route 或 Controller 經過 return ProductResource()::make()
後,$this 視作 class ProductResource 的 instance ( make() 作用,詳細參考 [Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static())class ResourceResponse
底下,看看 toResponse()
的作用json() 的格式如:
json()
格式:<?php
// $this->wrap(): 內容,表示的是 json 的 $data
public function json(
$data = [],
$status = 200,
array $headers = [],
$options = 0
)
$this->toArray()
就會去 call class ProductResource 的 public function toArray($request)
public/index.php ->
Kernel handle() 處理 request ->
處理 request 到對應的 route ->
派發 request 到配對的 route ->
預處理 response ->
request 轉為 response, 判斷 response 類別(Responseable, Stringable, Arrayable..等), 以及將 response 轉換成 JSON 格式 輸出
Responseable 與 JsonResource 關係 ->
『new ResourceResponse($this)->toResponse($request)』 ->
class ResourceResponse method toResponse()
->
返回 class JsonResource 的 resolve() ->
第四站 new ResourceResponse($this)解釋,此時的 $this 視作 class ProductResource ->
此時 $this->toArray(),就會去 call class ProductResource 的 public function toArray($request)
Laravel 底層把每個 method 都包得太好了,追程式的過程我忘記自己追到哪裡時,幸虧有 Laravel Request Lifecycle 做為指引,因此,迷失在程式大洋中時,我都會重新再看一次指引的地圖,在此感謝 Mia 提供的 Laravel Request Lifecycle 地圖 和 SoJ 作為嚮導。
1 Laravel Request Lifecycle 請求的生命週期
2 [Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static()