目錄
前言
Controller
Service
UserController
UserService
Repository
UserRepository
Action
CreateUser
Common
Event
Exception
首頁 後端開發 php教程 基於PHP Laravel,聊聊少寫PHP '爛'程式碼的方法! !

基於PHP Laravel,聊聊少寫PHP '爛'程式碼的方法! !

Jun 07, 2021 pm 06:49 PM
laravel php

這篇文章給大家詳細介紹如何少寫PHP "爛"程式碼! !有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

基於PHP Laravel,聊聊少寫PHP '爛'程式碼的方法! !

寫給初生牛犢不怕虎的童鞋們,大佬可隨意摘看 本章基於PHP Laravel

前言

#常會有人問

  • 目錄如何設計比較好?
  • 程式碼如何分佈好?
  • 怎麼寫一個可維護的項目?

「爛」專案我也沒少寫,以下是參考網路各大佬的文章總結及個人開發經驗而來.

Controller

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

Controller顧名思義是控制器,在入門PHP的時候,就知道Controller代表MVC中的C層, MVC本身的概念就程式碼分離,教你如何如何將業務分開,但面臨著業務的不斷發展,程式碼的複雜度也隨之提高,功能與功能之間的連結錯綜複雜,最後你的MVC就變成了下圖,所以僅僅依托MVC的設計思想已經無法支撐不斷發展的業務。

現在我們將Controller的任務和能力重新定義,控制器僅僅控制Http Reqeust的請求,這樣就符合了SOLID 單一功能原則.

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

直接將業務程式碼寫在Controller中,會使得程式碼及其臃腫,不易於維護和擴展

<?php
	namespace App\Http\Controller;

	class UserController extends Controller{

		public function register(Request $request){
			$user = new User();
			$user->username = $request->input(&#39;username&#39;);
			$user->password = $request->input(&#39;password&#39;);
			$result = $user->save();

			return $result;
		}

	}
登入後複製

這時就應該思考如何分離業務程式碼,我們引入Service的概念

Service

Service本身翻譯為服務

  • 將外部方法,公共方法注入到Service
  • #將Service注入到控制器

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

像上圖這樣

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[&#39;username&#39;];
            $password = $data[&#39;password&#39;];
         
			$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的依賴反轉

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

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[&#39;user_id&#39;];
            $result = User::where(&#39;id&#39;,$userId)->first();
			
			return $result;
		}

    }
登入後複製

解決了R的問題,有人就問了,難道因為CUD比較統一簡單就可以放在一起了嗎?答案是NO,我們引用一個新的名詞Action。

Action

這是看了@Charlie_Jade的文章才學到的

獨立每個操作文件,例如CreateUser ,DeleteUser,UpdateUser

  • 符合SOLID的單一原則

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

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[&#39;user_id&#39;];            $result = User::where(&#39;id&#39;,$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[&#39;tel&#39;];$models->password = $data[&#39;password&#39;];$result           = $models->save ();return $result;
		}
	}
登入後複製

以上程式碼邏輯見下圖

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

除模版(V)等HTML,JS等,還需要一些其他的規則,或者說是方式去實作一些程式碼的解耦合,以下不再提供程式碼案例。

Common

譯為公共的,常用的,再部分開發中,你可能需要一些公共的方法(並非公共的類,例如郵件發送等,用他並不合適),例如查詢用戶餘額,查詢用戶是否註冊或是否在線,產生訂單號等。使用Common更要簡單。他比較像一個公共函數庫的樣子

基於PHP Laravel,聊聊少寫PHP 爛程式碼的方法! !

Event

不在乎執行結果時可以選擇使用,但Event的Listen也是提供了佇列。

Exception

不要將你的所有錯誤提示都使用Return返回,很多時候你的返回未必是你的返回

推薦學習:《PHP視頻教程

以上是基於PHP Laravel,聊聊少寫PHP '爛'程式碼的方法! !的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP與Python:用例和應用程序 PHP與Python:用例和應用程序 Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

解決 Craft CMS 中的緩存問題:使用 wiejeben/craft-laravel-mix 插件 解決 Craft CMS 中的緩存問題:使用 wiejeben/craft-laravel-mix 插件 Apr 18, 2025 am 09:24 AM

在使用CraftCMS開發網站時,常常會遇到資源文件緩存的問題,特別是當你頻繁更新CSS和JavaScript文件時,舊版本的文件可能仍然被瀏覽器緩存,導致用戶無法及時看到最新的更改。這個問題不僅影響用戶體驗,還會增加開發和調試的難度。最近,我在項目中遇到了類似的困擾,經過一番探索,我找到了wiejeben/craft-laravel-mix這個插件,它完美地解決了我的緩存問題。

laravel用戶登錄功能 laravel用戶登錄功能 Apr 18, 2025 pm 12:48 PM

Laravel 提供了一個全面的 Auth 框架,用於實現用戶登錄功能,包括:定義用戶模型(Eloquent 模型)創建登錄表單(Blade 模板引擎)編寫登錄控制器(繼承 Auth\LoginController)驗證登錄請求(Auth::attempt)登錄成功後重定向(redirect)考慮安全因素:哈希密碼、防 CSRF 保護、速率限制和安全標頭。此外,Auth 框架還提供重置密碼、註冊和驗證電子郵件等功能。詳情請參閱 Laravel 文檔:https://laravel.com/doc

See all articles