国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

簡單實(shí)現(xiàn)類似laravel的Facades『靜態(tài)代理』

神手小生

在 Laravel 應(yīng)用中,F(xiàn)acade 就是一個(gè)可以從容器訪問對象的類。其中核心的部件就是 Facade 類。不管是 Laravel 自帶的 Facades,還是自定義的 Facades,都繼承自 Illuminate\Support\Facades\Facade 類。

Facade 基類使用了__callStatic() 魔術(shù)方法,直到對象從容器中被解析出來后,才會進(jìn)行調(diào)用。

webman已經(jīng)有安裝Illuminate相關(guān)擴(kuò)展包,我們只要重寫__callStatic() 魔術(shù)方法即可實(shí)現(xiàn),其實(shí)很簡單,就是把自定義的xxFacade類注入到容器中即可。

廢話不多說,開整

1,安裝illuminate/container 擴(kuò)展

composer require illuminate/container

2,創(chuàng)建app\Facade\Facade.php 門面類

<?php
namespace app\Facade;

use Illuminate\Support\Facades\Facade as MainFacade;
use support\Container;

/**
 * 以服務(wù)容器方式重寫
 *
 * @package app\Facade
 */
class Facade extends MainFacade
{
    /**
     * 重寫私有魔術(shù)方法
     *
     * @return mixed
     */
    public static function __callStatic($method, $args)
    {
        if (!Container::has(static::getFacadeAccessor())) {
            Container::make(static::getFacadeAccessor(), $args);
        }
        return Container::get(static::getFacadeAccessor())->$method(...$args);
    }
}

3,創(chuàng)建一個(gè) app\Facade\TestFacade,只要繼承重寫的Facade即可

<?php
namespace app\Facade;

use app\Facade\Accessor\TestAccessor;

/**
 * Class TestFacade
 * @method static set($data)
 * @method static get()
 * @package app\Facade
 */
class TestFacade extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return TestAccessor::class;
    }
}

4,創(chuàng)建實(shí)現(xiàn) app\Facade\Accessor\TestAccessor 實(shí)現(xiàn)類

<?php
namespace app\Facade\Accessor;

/**
 * Class TestAccessor
 * @package app\Facade\Accessor
 */
class TestAccessor
{
    /**
     * @var $data
     */
    private $data;

    /**
     * 設(shè)置
     * 
     * @param $data
     * @return $this
     */
    public function set($data): TestAccessor
    {
        $this->data = $data;
        return $this;
    }

    /**
     * 獲取
     * 
     * @return mixed
     */
    public function get()
    {
        return $this->data;
    }
}

5,現(xiàn)在就可以像laravel一樣使用門面類了

## 設(shè)置數(shù)據(jù)
TestFacade::set('hello');

## 獲取數(shù)據(jù)
TestFacade::get()

昨天用webman做一個(gè)小業(yè)務(wù),看了下社區(qū)沒有合適的插件和分享,就簡單的處理下。不對的地方望指正,有時(shí)間的伙伴可以按這個(gè)思路將其封裝插件或擴(kuò)展包,方便需要用的伙伴使用。

感謝

821 4 2
4個(gè)評論

lake

Facades 解決了什么問題

  • 暫無評論
holly188

不建議使用這種方式,會影響IDE的代碼分析,反而降低了開發(fā)體驗(yàn)。

釋永戰(zhàn)

很好,但是推薦使用webman

  • 暫無評論
ersic

感謝分享

  • 暫無評論

神手小生

220
積分
0
獲贊數(shù)
0
粉絲數(shù)
2023-11-30 加入
??