中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

淺析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

库尔勒市| 贵南县| 海门市| 儋州市| 柯坪县| 沙雅县| 吴堡县| 洛浦县| 隆昌县| 宁远县| 灵川县| 双辽市| 三都| 云南省| 玉溪市| 巩义市| 林西县| 大姚县| 温州市| 永登县| 崇左市| 阜平县| 临邑县| 日喀则市| 龙南县| 梁河县| 中西区| 孝义市| 界首市| 郑州市| 明光市| 庐江县| 朝阳县| 丹阳市| 屯留县| 托克托县| 阜宁县| 赞皇县| 宽甸| 潼南县| 海盐县|