亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

淺析laravel門面原理與實現

發布時間:2020-07-10 21:33:11 來源:網絡 閱讀:1265 作者:hgditren 欄目:開發技術

Facade模式

描述:Facade模式要求一個子系統的外部與其內部的通信必須通過一個統一的Facade對象進行。Facade模式提供一個高層次的接口,使得子系統更易于使用。

意義:將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。

實現原理
工作流程圖

淺析laravel門面原理與實現

業務中需要使用子系統的能力步驟:

1.調用子系統的訪問門面,獲取相關服務;
2.門面從容器中獲取子系統的實例;
3.通過子系統的實例,調用其相關服務。

相關技術點分析:

1.了解facade模式。
2.調用子系統門面中不可訪問的方法,會自動觸發__callstatic
如 \App\Facade\Redis::set(.....);
3.static 靜態延時綁定。參考:PHP后期靜態綁定
4.Closure 匿名函數的運用,只有調用$closure()才開始真正起作用。
5.容器的實現。

代碼實現
目錄結構

淺析laravel門面原理與實現

\client.php 業務調用客戶端:

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 */
namespace App;
require_once './InitIoc.php';
require_once './Facade.php';
require_once './Facade/Redis.php';

use App\Facade\Redis;

Redis::set('a','b');
echo PHP_EOL;

\Facade.php 門面類

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 * Time: 上午11:04
 */
namespace App;

use App\Ioc;

class Facade
{
    public static function getFacadeRoot()
    {
        $facadeAccessor = static::getFacadeAccessor();
        $obj = Ioc::resolve($facadeAccessor);
        return $obj();
    }

    /**
     *
     * @param string $name
     * @param array $arguments
     * @return mixed
     */
    public static function __callStatic(string $name, array $arguments)
    {

        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }
        return $instance->$name(...$arguments);
    }
}

\Facede\Redis.php 訪問子系統能力的門面

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 * Time: 上午11:07
 */
namespace App\Facade;
//require_once '../Facade.php';

use App\Facade;

class Redis extends Facade
{
    public static function getFacadeAccessor():string
    {
        return 'redis';
    }
}

\Ioc.php服務容器

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 * Time: 上午11:22
 */
namespace App;

class Ioc
{
    public static $instance = [];

    /**
     * 注入容器
     * @param string $name
     * @param \Closure $closure
     */
    public static function register(string $name,\Closure $reslove)
    {
        static::$instance[$name]=$reslove;
    }

    /**
     * 返回實例
     * @param string $name
     * @return mixed
     */
    public static function resolve(string $name){
        if(static::$instance[$name] instanceof \Closure){
            return static::$instance[$name];
        }else{
            new $name;
        }
    }
}

\Subsystem\Redis.php 子系統服務能力類

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 * Time: 下午12:07
 */
namespace App\Subsystem;

class Redis
{
    public static function set(){
        echo "Hello world";
    }
}

\InitIoc.php 將子系統的實例注入到容器

<?php
/**
 * Created by PhpStorm.
 * User: zhangrenjie
 * Date: 2019/1/12
 * Time: 下午1:45
 */
namespace App;
require_once './Subsystem/Redis.php';
require_once './Ioc.php';

use App\Subsystem\Redis;
use App\Ioc;

//將Redis連接注入容器
Ioc::register('redis',function(){
    return new Redis();
});
向AI問一下細節

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

AI

余姚市| 南皮县| 姚安县| 虞城县| 五华县| 客服| 怀化市| 阿尔山市| 开远市| 湖口县| 轮台县| 霞浦县| 雷州市| 嘉黎县| 安塞县| 庄河市| 周宁县| 温州市| 鹿邑县| 当阳市| 天全县| 淮滨县| 赤峰市| 屏东市| 白银市| 台中市| 苍梧县| 无锡市| 德江县| 乳山市| 靖远县| 岳阳市| 和平区| 南乐县| 琼结县| 如皋市| 平原县| 广南县| 皋兰县| 香河县| 定兴县|