寫給初生牛犢不怕虎的童鞋們,大佬可隨意摘看本章基於PHP Laravel
#前言
常會有人問
- 目錄如何設計比較好?
- 程式碼如何分佈好?
- 怎麼寫一個可維護的項目?
「爛」專案我也沒少寫,以下是參考網路各大佬的文章總結及個人開發經驗而來.
Controller

Controller顧名思義是控制器,在入門PHP的時候,就知道Controller代表MVC中的C層, MVC本身的概念就程式碼分離,教你如何如何將業務分開,但面臨著業務的不斷發展,程式碼的複雜度也隨之提高,功能與功能之間的連結錯綜複雜,最後你的MVC就變成了下圖,所以僅僅依托MVC的設計思想已經無法支撐不斷發展的業務。
現在我們將Controller的任務和能力重新定義,控制器僅僅控制Http Reqeust的請求,這樣就符合了SOLID 單一功能原則.

直接將商業程式碼寫在Controller中,會使得程式碼及其臃腫,不易於維護和擴展
<?php namespace App\Http\Controller; class UserController extends Controller{ public function register(Request $request){ $user = new User(); $user->username = $request->input('username'); $user->password = $request->input('password'); $result = $user->save(); return $result; } }复制代码
這時就應該思考如何分離業務程式碼,我們引入Service的概念
Service
Service本身翻譯為服務
- 將外部方法,公用方法注入到Service
- #將Service注入到控制器

像上圖這樣
UserController
<?php namespace App\Http\Controller; class UserController extends Controller{ public $request; protected $userService; public function __construct(Request $request, UserService $userService) { $this->request = $request; $this->userService = $userService; } public function register() { //... validation return $this->userService->register ($this->request->all()); } }复制代码
UserService
<?php namespace App\Service; class UserService{ public function register($data) { $username = $data['username']; $password = $data['password']; $password = encrypt ($password); $user = new User(); $user->username = $username; $user->password = $password; $result = $user->save(); return $result; } }复制代码
到現在為止,我們至少將業務與請求徹底分開了。但還是不如人意,如果把所有的業務及CURD全部寫在Service中,那隻不過是將Controller的臃腫轉移到了Service,那Service就沒有什麼存在意義了。 所以我們需要繼續分割Service,將對資料庫的R操作獨立出來,因為CUD的操作基本上是一貫不變的,而R操作根據業務的複雜度則變的多姿多彩。所以獨立R操作。這時候我們引用Repository的概念。
Repository
我們使用Repository輔助Model,將相關的查詢邏輯封裝到不同的repository中,方便邏輯程式碼的維護
- 符合SOLID的單一原則
- 符合SOLID的依賴反轉

#UserController
<?php namespace App\Http\Controller; class UserController extends Controller{ public $request; protected $userService; public function __construct(Request $request, UserService $userService) { $this->request = $request; $this->userService = $userService; } public function getUserInfo() { //... validation return $this->userService->getUserInfo ($this->request->all()); } }复制代码
UserService
<?php namespace App\Service; class UserService{ public $userRepository; public function __construct(UserRepository $userRepository){ $this->userRepository = $userRepository; } public function getUserInfo() { return $this->userRepository->getUserInfo($data); } }复制代码
UserRepository
<?php namespace App\Repository; class UserRepository{ public function getUserInfo($data) { $userId = $data['user_id']; $result = User::where('id',$userId)->first(); return $result; } }复制代码
解決了R的問題,有人就問了,難道因為CUD比較統一簡單就可以放在一起了嗎?答案是NO,我們引用一個新的名詞Action。
Action
這是看了@Charlie_Jade的文章才學到的
獨立每個操作文件,例如CreateUser,DeleteUser,UpdateUser
- 符合SOLID的單一原則

#UserController
<?php namespace App\Http\Controller; class UserController extends Controller{ public $request; protected $userService; public function __construct(Request $request, UserService $userService) { $this->request = $request; $this->userService = $userService; } public function register(){ //... validation return $this->userService->register($this->request->all()); } public function getUserInfo() { return $this->userService->getUserInfo ($this->request->all()); } }复制代码
UserService
<?php namespace App\Service; class UserService{ public function getUserInfo(UserRepository $userRepository) { return $this->userRepository->getUserInfo($data); } public function register(){ $result = (new CreateUser())->execute($this->request->all()); return $result; } }复制代码
UserRepository
<?php namespace App\Repository; class UserRepository{ public function getUserInfo($data) { $userId = $data['user_id']; $result = User::where('id',$userId)->first(); return $result; } }复制代码
CreateUser
<?php namespace App\Action; use App\Model\Member; class CreateUser extends CreateUserWallet { public function execute(array $data) { $models = new Member(); $models->tel = $data['tel']; $models->password = $data['password']; $result = $models->save (); return $result; } }复制代码
以上程式碼邏輯見下圖

除模版(V)等HTML,JS等,還需要一些其他的規則,或者說是方式去實作一些程式碼的解耦合,以下不再提供程式碼案例。
Common
譯為公共的,常用的,再部分開發中,你可能需要一些公共的方法(並非公共的類,例如郵件發送等,用他並不合適),例如查詢用戶餘額,查詢用戶是否註冊或是否在線,產生訂單號等。使用Common更要簡單。他比較像是公用函數函式庫的樣子

Event
你不在乎執行結果時可以選使用,不過Event的Listen也是提供了隊列。
Exception
不要將你的所有錯誤提示都使用Return返回,很多時候你的返回未必是你的返回
致謝
感謝各位同學看完這篇文章,如果你有新的想法歡迎在留言區討論.
#推薦教學:《php教學》
以上是如何寫出高品質的PHP程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載
最受歡迎的的開源編輯器