用PHP特性trait實現簡易Laravel Facade
以下由Laravel教學專欄跟大家介紹如何利用PHP trait實作簡易Facade,希望對大家有幫助!
## 簡述
##Facade##簡稱
##Facade
##Laravel
大部分的擴充包都使用了 Facade
。 【推薦:
】下面的簡易Facade 主要利用PHP 的特性trait
,魔術方法__callStatic
,反射類別ReflectionClass
。使用場景
後台系統大部分都會有類似這樣的操作:<?php $user = User::find($id);if (!$user) { throw new \Expection("资源不存在");}
$article = Article::find($id);if (!$article) { throw new \Expection("资源不存在");}$article->delete();
上程式碼
#1、首先我們應該要有一個Service#
<?phpnamespace App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{ use ModeServiceTrait;}
2、新建一個Trait
trait 為了多繼承而存在的,可以去PHP官網看文件。 <?php namespace App\Traits; use \ReflectionClass; use \Exception;use \ReflectionException; use Illuminate\Database\Eloquent\Model; use App\Exceptions\ResourceException; /** * @method static Model find(string $className, int $id, callable $callback = null) * * @see Model * @package App\Services */trait ModeServiceTrait{ /** * 回调方法 * * @param Model|null $model * @param string $method * @return Model * @throws ResourceException */ public static function callback(Model|null $model, string $method): Model { switch ($method) { case 'first': case 'find': if (!$model) { throw new ResourceException("资源不存在"); } break; default: break; } return $model; } /** * 调用不存在的方法时触发 * * @param $method * @param $args * @return false|mixed * @throws ReflectionException * @throws ResourceException * @throws Exception */ public static function __callStatic($method, $args) { $className = $args[0]; $arg = $args[1]; // 判断模型类是否存在 if (!class_exists($className)) { throw new Exception("The class {$className} could not be found. from:" . __CLASS__); } // 利用反射实例化其类 $reflection = new ReflectionClass($className); $instance = $reflection->newInstanceArgs(); // 调用该不存在的方法 $model = call_user_func_array([$instance, $method], [$arg]); // 如果存在复杂操作交给 callback return isset($args[2]) ? $args[2]($model) : self::callback($model, $method); }}
首先我們專注於
__callStatic 這個魔術方法。當呼叫不存在的靜態方法時會觸發該方法。和他相似的魔術方法是
__call。這是使用
__callStatic 是為了達到
Facade 的效果。
__callStatic 有兩個回呼參數
$method
被呼叫的且不存在的方法,$args#是$method
方法中所傳遞的參數(陣列形式)。這樣一個簡易的
trait
使用
我們新一個command$ php artisan make:command TestCommand
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Services\ModelService; use App\Models\Article\Article; class TestCommand extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'test:test'; /** * The console command description. * * @var string */ protected $description = 'a test'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. */ public function handle() { $article = ModelService::find(Article::class, 1); $article = ModelService::find(Article::class, 1, function ($model) { return $model->load('author'); }); }}
其中的Article
模型需要自己去建立。 接下來就可以看看效果了:
$ php artisan test:test
結語
###這樣我們就拋棄了使用###abstract## # 抽象類,來達到了跟###Facade### 一樣的效果。同時也做到了程式碼復用。 ###這樣使用程式會多走很多步,但跟優雅比起來,性能什麼的都無所謂了。 ######表達不是很清楚,需要自己深入體會了。 ### ###以上是用PHP特性trait實現簡易Laravel Facade的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHPtraitDTO:簡化資料傳輸物件的開發引言:在現代的軟體開發中,資料傳輸物件(DataTransferObject,簡稱DTO)扮演了重要的角色。 DTO是一種純粹的資料容器,用於在層與層之間傳遞資料。然而,在開發過程中,開發人員需要編寫大量的相似的程式碼來定義和操作DTO。為了簡化這個過程,PHP引入了trait特性,我們可以利用trait特

深入了解PHPtraitDTO的設計模式與實務Introduction:在PHP開發中,設計模式是不可或缺的一部分。其中,DTO(DataTransferObject)是一種常用的設計模式,用於封裝資料傳輸的物件。而在實現DTO的過程中,使用trait(特徵)可以有效提高程式碼的複用性和靈活性。本文將深入探討PHP中traitDTO的設計模式與實踐

PHPtraitDTO:優化資料傳輸過程的關鍵利器,需要具體程式碼範例簡介:在開發過程中,資料傳輸是一個非常常見的需求,尤其是在不同層級之間傳遞資料時。在傳輸這些資料過程中,我們常常需要對資料進行處理、驗證或轉換,以滿足不同的業務需求。為了提高程式碼的可讀性和可維護性,我們可以使用PHPtraitDTO(DataTransferObject)來最佳化

PHPtraitDTO:實現資料傳輸物件的簡潔性與彈性引言:在PHP開發過程中,經常會涉及資料的傳輸與處理。而傳輸物件模式(DataTransferObject,簡稱DTO)是一種設計模式,它用於將資料在不同層之間傳輸。在傳輸過程中,DTO透過封裝資料、提供公共存取方法來簡化資料的操作。本文將介紹如何使用PHPtrait來實現DT

使用PHPtraitDTO實現高度可自訂的資料傳輸框架隨著網站和應用程式變得越來越複雜,資料傳輸變得越來越重要。在PHP中,透過使用資料傳輸物件(DataTransferObject,簡稱DTO)來處理資料傳輸可以大幅簡化程式碼,並提高可維護性和擴展性。本文將介紹如何使用PHPtrait和DTO實現一個高度可自訂的資料傳輸框架,並提供相應的程式碼範例。

PHPtraitDTO:優雅的資料傳輸物件模式概述:資料傳輸物件(DataTransferObject,簡稱DTO)是一種設計模式,用於在不同層之間傳輸資料。在應用程式中,經常需要從資料庫或外部服務獲取數據,並在應用程式的不同層之間進行傳遞。 DTO模式可以讓資料傳輸更加簡潔、清晰,同時也便於擴展與維護。在PHP中,我們可以使用trait來實現DTO

PHPtraitDTO:優化資料傳輸流程的關鍵工具,需要具體程式碼範例在開發過程中,資料的傳輸是一個十分關鍵的環節。如何有效率地傳輸數據,成為了開發者需要解決的難題之一。 PHP語言中,使用traitDTO(DataTransferObject)可以優化資料傳輸流程,提高資料傳輸的效率。本文將介紹什麼是traitDTO,以及如何使用它來最佳化資料傳輸流

PHPtraitDTO:提高資料傳輸效率的關鍵技術簡介:在現代軟體開發中,資料傳輸是一個非常重要的環節。在大多數應用程式中,資料需要從一個地方傳輸到另一個地方,例如從資料庫到前端頁面、從前端表單到後端處理邏輯等。而資料傳輸的效率直接影響了整個系統的效能和使用者體驗。為了提高資料傳輸的效率,我們可以使用PHP的traitDTO(DataTransferO
