小練習 – 共識 Controller 與 URL

拿出您的倒數計時器,計時30分鐘

目的:今天希望可以跟您一起達成一個URL 以及 Controller 擺放在專案的哪裡,比較好維護。


達成共識也是就是說,團隊的開發中,如果可以有達成一個共識,可以在不同人在維護時,可以比較快速的找到,需求應該在哪裡修改。

Controller 怎麼分?

新手一開始都會在同一個Controller新增很多個方法,並且把所有的流程程式都塞在這個Controller 類別的檔案中,導致這個Controller 非常多,這樣會非常不容易維護。

假設系統當中有四大分類,客戶、管理、銷貨存、系統設定,千萬不要在專案中只建立這四個Controller,這樣這四個Controller很可怕。

建議可以依照 資源 來分 Controller,例如《使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)》書中有提到 Animal 資源,專門在操作Animal 資料表的Controller 新增刪除修改的檔案。

裡面每一個方法都對應的一個URL。

Create 方法對應到建立動物的那個操作畫面,可以 小練習 – 共識 Controller function 這篇文章,如果您都理解裡面的內容。

接著就是要說明Controller與URL,存放在哪個資料夾的關係。


在《使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)》書中 18-5 頁有簡單提到,現在更全面一點的補充。

是以同一個專案當中,如果有前後端,

App\Http\Controllers 資料夾中存放的是包含前端網頁的處理 小練習 – 共識 Controller function 這一篇有提到。

App\Http\Controllers\Api\V* 裡面存的是不同版本的,API Controller

接下來建議再加一層資料夾 App\Http\Controllers\Animal\AnimalController.php ,這個網址 127.0.0.1/animals 的所有事。

方法名稱定義備註
index列表那一頁顯示的畫面
create建立 Animal 操作的那個畫面
store使用者在建立Animal資源的儲存進入資料庫的動作
show顯示一單動物資源的畫面
edit更新單一動物資源的畫面
update更新但一動物資源進入資料庫的動作
destroy移除一個動物資源的動作
AnimalController.php

為什麼要多一層,因為系統會越來越複雜,假設你想做一個網址是 127.0.0.1/animals/{animal}/users ,建議將controller 存在上一課動物的controller同一個資料夾 App\Http\Controllers\Animal\AnimalUserController.php 新增一個 AnimalUserController.php

方法名稱定義備註
index該動物 {animal} 跟哪些user有關係的那一頁列表顯示的畫面
create建立 Animal 與 User 關係的那個畫面
store使用者在建立Animal資源與User資源儲存進入資料庫的動作
show這個就跟查看user 資料一項,看有沒有需要實作。
edit這個就跟編輯user 資料一項,看有沒有需要實作。
update這個就跟更新user 資料的動作,看有沒有需要實作。
destroy移除一個Animal 以及 User 的關係的動作
AnimalUserController.php

因此才會建議你 App\Http\Controllers 多一層 資料夾,例如上面所提到的,這樣比較好擴充,目前 App\Http\Controllers\Animal 資料夾中有

  • AnimalController.php
  • AnimalUserController.php

兩個檔案,一個專門在處理 Animal資源,另一個定義專門在處理 Animal 與User資源的關係。

以上講的都是前後端是在一起的部分

如果你想猜開來,我想這是蠻多公司再把原本專案專程前後端分離會遇到的事情,或許可以先將,動作 拆。

剛剛有提到資料夾 App\Http\Controllers\Api\V* 這個資料夾專門來存放API,假設網址依照RESTful 規範去製作, 127.0.0.1/api/v1/animals/{animal},那麼這一組網址的動作應該放在哪裡呢?

答案揭曉

App\Http\Controllers\Api\V1\Animal\AnimalController.php

你想對了嗎?道理是一樣的,這個AnimalController 專門負責 V1 版本的 animals 資源的API操作,查看列表資料(不是做那個畫面,只是單純回傳列表資料)、新增、刪除、修改這些動作,Controller中的方法,就如同我 《使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)》書中有提到,就不在額外贅述了!

感謝你們的觀看,可以達成共識,再多人維護的團隊中,會比較容易找要修改的地方在哪裡,假設你接到了一個需求,希望可以在修改動物資料的時候,新增一些其他操作。

就可以很輕鬆的去判斷,如果要動到畫面,可以找

App\Http\Controllers\Animal\AnimalController.php 的 edit 方法

可以再確認一下,這個修改的動作,是請求哪一個網址,假設是請求未拆分前後端的網址,可以開啟

App\Http\Controllers\Animal\AnimalController.php 的 update 方法

如果已經到慢慢前後端分離的狀態,或許要修改的地方是

App\Http\Controllers\Api\V1\Animal\AnimalController.php 的 update 方法

整個效率上會大大提升,產生共識後我覺得可以帶來的好處,就跟為什麼要使用Laravel 一樣,已經有規範好一些地方,大方向都有了!其他像這樣的細部細節的共識,所覺得如果團隊越來越大,應該要定義一下。

發佈留言