首頁 php框架 Laravel 用PHP特性trait實現簡易Laravel Facade

用PHP特性trait實現簡易Laravel Facade

Jan 27, 2022 pm 04:33 PM
facade trait

以下由Laravel教學專欄跟大家介紹如何利用PHP trait實作簡易Facade,希望對大家有幫助!

## 簡述

##Facade##簡稱##Facade
##Laravel 大部分的擴充包都使用了 Facade。 【推薦:

laravel影片教學

下面的簡易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 &#39;first&#39;:
            case &#39;find&#39;:
                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 = &#39;test:test&#39;;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;a test&#39;;

    /**
     * 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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 trait DTO:簡化資料傳輸物件的開發 PHP trait DTO:簡化資料傳輸物件的開發 Oct 12, 2023 am 09:04 AM

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

深入了解PHP trait DTO的設計模式與實踐 深入了解PHP trait DTO的設計模式與實踐 Oct 12, 2023 am 08:48 AM

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

PHP trait DTO:最佳化資料傳輸過程的關鍵利器 PHP trait DTO:最佳化資料傳輸過程的關鍵利器 Oct 12, 2023 pm 03:10 PM

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

PHP trait DTO:實現資料傳輸物件的簡潔與彈性 PHP trait DTO:實現資料傳輸物件的簡潔與彈性 Oct 12, 2023 am 10:21 AM

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

使用PHP trait DTO實現高度可自訂的資料傳輸框架 使用PHP trait DTO實現高度可自訂的資料傳輸框架 Oct 12, 2023 pm 12:46 PM

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

PHP trait DTO:優雅的資料傳輸物件模式 PHP trait DTO:優雅的資料傳輸物件模式 Oct 12, 2023 am 08:34 AM

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

PHP trait DTO:優化資料傳輸流程的關鍵工具 PHP trait DTO:優化資料傳輸流程的關鍵工具 Oct 12, 2023 am 09:27 AM

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

PHP trait DTO:提高資料傳輸效率的關鍵技術 PHP trait DTO:提高資料傳輸效率的關鍵技術 Oct 12, 2023 pm 03:01 PM

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

See all articles