91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用PHP特性trait實現簡易Laravel Facade

發布時間:2022-01-28 18:54:00 來源:億速云 閱讀:153 作者:iii 欄目:編程語言

今天小編給大家分享一下怎么用PHP特性trait實現簡易Laravel 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

以上就是“怎么用PHP特性trait實現簡易Laravel Facade”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湟中县| 东港市| 工布江达县| 政和县| 保定市| 营口市| 依兰县| 磴口县| 克拉玛依市| 左权县| 昌平区| 德钦县| 武宁县| 西乌珠穆沁旗| 太原市| 巴彦淖尔市| 临朐县| 盐边县| 阜康市| 鸡西市| 吉水县| 南靖县| 固始县| 盐津县| 贞丰县| 蓬安县| 佛冈县| 开封县| 衢州市| 马公市| 若尔盖县| 宣威市| 定南县| 三江| 邛崃市| 磐安县| 昂仁县| 利辛县| 康保县| 莱西市| 通渭县|