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

溫馨提示×

溫馨提示×

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

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

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

龙陵县| 渭源县| 浦江县| 柘城县| 闽侯县| 盱眙县| 岫岩| 麻城市| 海安县| 民勤县| 同仁县| 桂平市| 上虞市| 会东县| 木里| 泸西县| 开鲁县| 古丈县| 潼关县| 建平县| 开封县| 博罗县| 广汉市| 玉林市| 万盛区| 昌吉市| 会理县| 龙门县| 绿春县| 郑州市| 古丈县| 菏泽市| 星子县| 蕉岭县| 阳谷县| 共和县| 新安县| 伊金霍洛旗| 西和县| 宜春市| 木里|