溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

淺析laravel門面原理與實(shí)現(xiàn)

發(fā)布時(shí)間:2020-07-10 21:33:11 來源:網(wǎng)絡(luò) 閱讀:1265 作者:hgditren 欄目:開發(fā)技術(shù)

Facade模式

描述:Facade模式要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個(gè)統(tǒng)一的Facade對(duì)象進(jìn)行。Facade模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。

意義:將一個(gè)系統(tǒng)劃分成為若干個(gè)子系統(tǒng)有利于降低系統(tǒng)的復(fù)雜性。一個(gè)常見的設(shè)計(jì)目標(biāo)是使子系統(tǒng)間的通信和相互依賴關(guān)系達(dá)到最小。

實(shí)現(xiàn)原理
工作流程圖

淺析laravel門面原理與實(shí)現(xiàn)

業(yè)務(wù)中需要使用子系統(tǒng)的能力步驟:

1.調(diào)用子系統(tǒng)的訪問門面,獲取相關(guān)服務(wù);
2.門面從容器中獲取子系統(tǒng)的實(shí)例;
3.通過子系統(tǒng)的實(shí)例,調(diào)用其相關(guān)服務(wù)。

相關(guān)技術(shù)點(diǎn)分析:

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

代碼實(shí)現(xiàn)
目錄結(jié)構(gòu)

淺析laravel門面原理與實(shí)現(xiàn)

\client.php 業(yè)務(wù)調(diào)用客戶端:

<?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 訪問子系統(tǒng)能力的門面

<?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服務(wù)容器

<?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;
    }

    /**
     * 返回實(shí)例
     * @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 子系統(tǒng)服務(wù)能力類

<?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 將子系統(tǒng)的實(shí)例注入到容器

<?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問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI