浅析laravel门面原理与实现
生活随笔
收集整理的這篇文章主要介紹了
浅析laravel门面原理与实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Facade模式
描述:Facade模式要求一個子系統的外部與其內部的通信必須通過一個統一的Facade對象進行。Facade模式提供一個高層次的接口,使得子系統更易于使用。
意義:將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。
實現原理
工作流程圖
業務中需要使用子系統的能力步驟:
1.調用子系統的訪問門面,獲取相關服務;
2.門面從容器中獲取子系統的實例;
3.通過子系統的實例,調用其相關服務。
相關技術點分析:
1.了解facade模式。
2.調用子系統門面中不可訪問的方法,會自動觸發__callstatic
如 \App\Facade\Redis::set(.....);
3.static 靜態延時綁定。參考:PHP后期靜態綁定
4.Closure 匿名函數的運用,只有調用$closure()才開始真正起作用。
5.容器的實現。
代碼實現
目錄結構
\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(); });轉載于:https://blog.51cto.com/phpme/2342100
總結
以上是生活随笔為你收集整理的浅析laravel门面原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongo 记得开启验证
- 下一篇: py2exe打包pyqt程序