PHP框架 - CommonGateway JSON 處理之自動回傳
在「CommonGateway 初步第二篇 - JSON 的處理與資料上傳」說明了 CommonGateway 對於 JSON 資料的處理辦法。根據早先的規則要求,客戶端若想要取得 JSON 文件,則應送出需求標頭 Accept: application/json 。而 CG 收到此需求時,會自動載入和控制項方法同名的 JSON 視圖 (.pjs),例如 index.pjs, get.pjs 。而這些 JSON 視圖的內容,往往只有一行 echo json_encode($xxx);
,如「CommonGateway 初步第二篇 - JSON 的處理與資料上傳」範例所示。
這樣的視圖內容實在太空泛了。如果我有好幾個控制項都這麼回傳 JSON 文件的話,我就要複製改名好幾個這樣的 .pjs 視圖。這工作的重複性太高了, Don't Repeat Yourself 。根據 DRY 原則, CG 在 r62 擴充了視圖處理規則,增加一條自動回傳 JSON 文件的規則。如果客戶端要求傳回 JSON 文件但設計者未建立視圖時,CG 會自動調用 json_encode()
回傳資料模型(model)。在我的使用經驗上,九成的 JSON 視圖 (.pjs),其內容都只有一行 json_encode($model)
。故將此規則寫入 CommonGateway ,減少空泛又重複的 JSON 視圖文件。
舉例來說,我設計了一個音樂播放控制項 player.php 。其方法 index()
可以取回目前的曲目清單。
範例 index()
方法以陣列型態回傳了一個曲目清單。在介紹 CommonGateway 時就說, CG 會自動將方法回傳值指派為 $model
變數。當客戶端要求回傳 JSON 文件時, CG 會載入和控制項方法同名的 index.pjs 視圖,交由視圖處理 $model
的回報格式和內容。在此,這個方法只是要回傳曲目清單,又資料模型已經是曲目清單了,那麼 index.pjs 只需要一行便可完成工作:
不過這是在 r62 之前的情形。在 r62 增加自動回傳 JSON 規則之後,如果 CG 找不到 views/player/index.pjs ,就會自動調用 json_encode($model)
回傳 JSON 文件給客戶端。如果你的資料模型符合上述狀況,那麼你可以省略 JSON 視圖文件。
這項規則只有 JSON 視圖適用。其他如 XML 視圖等,並沒有 json_encode()
這麼一致的資料編碼法或序列化方法。CG 再聰明也猜不出你的 XML 結構想要長什麼樣子。如果你的 RESTful API 可提供 XML 文件的話,你還是得要自己建立 XML 視圖 (.pxml)。話雖如此,現在的 RESTful API 設計幾乎將 JSON 列為唯一的文件型態,而不處理其他文件型態。對於一個只回傳 JSON 文件的 RESTful API , CG 的 r62 擴充內容幾乎讓設計者不必建立任何視圖文件。
在一個設計規格比較寬鬆的環境中,設計者用 CG 實作 RESTfu API 時,實作好控制項方法後,可以先套用 CG 的自動回傳 JSON 規則,看看它產出的 JSON 文件的格式是否符合你的設計需求。如果不滿足的話,你才需要建立自己的 .pjs 視圖去處理回傳內容。在多數案例中,只需要實作控制項內容,而不必設計視圖,就幾乎完成一個可以用的 RESTful API 了。
樂多舊回應