gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

laravel為什么要用門面

在laravel中,因為門面能夠為應(yīng)用的服務(wù)容器提供一個“靜態(tài)”接口,相比于傳統(tǒng)的靜態(tài)方法,門面提供的“靜態(tài)”接口相當(dāng)于是服務(wù)容器底層類中的一個靜態(tài)代表,能夠提供更加靈活和易于測試的語法,所以在laravel中要用到門面。

laravel為什么要用門面

本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。

laravel為什么用門面

Laravel 中的門面總體上還是遵循著門面模式的基本思想的。Laravel 中的門面是為應(yīng)用的服務(wù)容器提供一個【靜態(tài)】接口,相當(dāng)于是服務(wù)容器底層類中的一個【靜態(tài)代表】,能夠提供更加靈活、易于測試、優(yōu)雅的語法。

對于 Laravel 中的門面來說,我們會經(jīng)常使用到,比如說緩存。

Cache::get('key');

再比如我們之前經(jīng)常用的數(shù)據(jù)庫和 Redis 。

DB::connection('mysql2')->table('db_test')->get()->toArray();   Redis::connection('default')->client()->get('test')

發(fā)現(xiàn)沒有,門面全是用的靜態(tài)方法。但是你點過去,會發(fā)現(xiàn)這個門面類里面什么東西都沒有呀!

class Cache extends Facade {     protected static function getFacadeAccessor()     {         return 'cache';     } }

在 Facade 類中,別的方法函數(shù)我們先不用看,直接拉到最底下,你會發(fā)現(xiàn)一個魔術(shù)方法,__callStatic() 。

public static function __callStatic($method, $args) {     $instance = static::getFacadeRoot();       if (! $instance) {         throw new RuntimeException('A facade root has not been set.');     }       return $instance->$method(...$args); }

__callStatic() 的意思是通過靜態(tài)調(diào)用時如果沒有定義對應(yīng)的方法,就進入到 __callStatic() 方法中,比如我們調(diào)用的 Cache::get() 這個方法,實際上當(dāng)前的 Cache 門面類以及它的父類 Facade 都沒有定義這個方法,那么就直接進入到了 __callStatic() 中。接著,它就通過 getFacadeRoot() 獲取我們當(dāng)前門面的實例對象,然后調(diào)用實例對象中的 get() 方法。

好了,到此為止,其實如果面試的時候有面試官問你 Laravel 中的門面模式是如何實現(xiàn)的時候,你就可以自信地說核心就是這個 __callStatic() 魔術(shù)方法了。那么這個具體的實例對象又是從哪里來的呢?我們繼續(xù)往下看。

實例對象

接下來我們看看 Facade 中的具體實例對象是怎么獲取的。這里我們又要回到服務(wù)容器中。不過還是先從門面入口來看看吧。

在 __callStatic() 方法中,我們會看到調(diào)用了一個 static::getFacadeRoot() 方法來獲得具體的實例對象。

public static function getFacadeRoot() {     return static::resolveFacadeInstance(static::getFacadeAccessor()); }

這個方法的內(nèi)容很簡單,就是調(diào)用了另外兩個方法,注意 getFacadeAccessor() 是我們的各個門面子類中實現(xiàn)的,比如例子中就是在 Cache 這個類中實現(xiàn)的。它只是返回一個實例的別名,還記得這個別名是在哪里定義的嗎?我們在服務(wù)容器中看到過,就是 vendor/laravel/framework/src/Illuminate/Foundation/Application.php 中 registerCoreContainerAliases() 方法里面定義的那些。

接下來,我們主要看的就是 static::resolveFacadeInstance() 這個方法。從名字我們可以出,它的意思是 解決門面實例 ,這貨要是不返回一個實例對象那還真對起它的名字了。

protected static function resolveFacadeInstance($name) {     if (is_object($name)) {         return $name;     }       if (isset(static::$resolvedInstance[$name])) {         return static::$resolvedInstance[$name];     }       if (static::$app) {         return static::$resolvedInstance[$name] = static::$app[$name];     } }

第一個判斷,如果傳遞進來的是一個對象,直接返回。第二個判斷,如果當(dāng)前實例數(shù)組中已經(jīng)有了,就不再創(chuàng)建了,類似于一個 享元模式 的效果。注意,靜態(tài)的成員數(shù)組哦!什么意思呢?靜態(tài)的全局共享的,也就是說,你這個實例對象創(chuàng)建之后,其他地方都可以使用,完全的單例狀態(tài)。最后一個判斷,app 也就是我們的服務(wù)容器存在的話,進行服務(wù)容器的操作。

我們先來看下這個 app 屬性是什么時候賦值的。在講服務(wù)提供者時,Kernel 中有一個 bootstrappers 屬性數(shù)組,其中有一個 RegisterFacades 提供者。很明顯,它是用于注冊門面的一個服務(wù)提供者,在這個服務(wù)提供者中,我們會看到這樣的代碼。

public function bootstrap(Application $app) {     Facade::clearResolvedInstances();       Facade::setFacadeApplication($app);       AliasLoader::getInstance(array_merge(         $app->make('config')->get('app.aliases', []),         $app->make(PackageManifest::class)->aliases()     ))->register(); }

其中的 Facade::setFacadeApplication() 就是將 服務(wù)容器 的 Application 對象注入到了門面類的靜態(tài)成員變量 app 中。注意,同樣是靜態(tài)的,全局存在的。

然后我們繼續(xù)回到 resolveFacadeInstance() 方法中。

protected static function resolveFacadeInstance($name) {     // …………     // …………     if (static::$app) {         return static::$resolvedInstance[$name] = static::$app[$name];     } }

這里怎么回事,怎么就通過 static::$app[$name] 就能獲得一個實例對象了呢?別激動,別著急,想想怎么讓一個對象可以進行這樣的數(shù)組操作?我們之前學(xué)過的哦!

就是這個 ArrayAccess 接口,它必須實現(xiàn)的那幾個方法可以讓對象像數(shù)組一樣去使用。

OK,知道原理了,我們來看看是不是這樣,找到 Application 的父類 vendor/laravel/framework/src/Illuminate/Container/Container.php 。

class Container implements ArrayAccess, ContainerContract {     // …………     // …………     public function offsetGet($key)     {         return $this->make($key);     }     // …………     // ………… }

真像大白了吧?不再需要我繼續(xù)多解釋了吧?關(guān)于 make() 方法在之前的服務(wù)容器中已經(jīng)講解過了哦。

好了,剩下的內(nèi)容交給你了,請根據(jù) vendor/laravel/framework/src/Illuminate/Foundation/Application.php 中 registerCoreContainerAliases() 方法中的別名找到 Cache 的具體實現(xiàn)類,然后分析它的 get()、set()、forget() 等方法的實現(xiàn),看看它們是怎么根據(jù)我們的配置文件來使用不同的緩存存儲方案的。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日本wwww视频| 天天干天天综合| 青青草原国产免费| 国产美女三级视频| 国产欧美日韩小视频| 亚洲视频在线不卡| 伊人免费视频二| 91 在线视频观看| 成人在线观看a| 欧美日韩中文在线视频| 欧美亚洲精品一区二区| 国产二区视频在线| 97视频久久久| www.日本在线播放| av高清在线免费观看| 欧美变态另类刺激| 男人操女人免费软件| 国产综合免费视频| 色播五月激情五月| 99热这里只有精品7| 狠狠干视频网站| 18禁免费观看网站| 精品国产成人av在线免| 自拍偷拍一区二区三区四区| 手机av在线网| 国风产精品一区二区| 国产精品又粗又长| 欧美黑人又粗又大又爽免费| 中文字幕有码av| 亚洲天堂第一区| 漂亮人妻被中出中文字幕| 手机看片福利日韩| 国产精品一二三在线观看| 国产在线精品91| 一区二区三区四区毛片| 日韩黄色短视频| 国产福利精品一区二区三区| 91免费版看片| 91视频免费版污| 二级片在线观看| 成人综合视频在线| 日本黄xxxxxxxxx100| 亚洲 中文字幕 日韩 无码| 精产国品一二三区| 日韩 欧美 高清| 亚洲国产精品女人| 特级丰满少妇一级| 亚洲美免无码中文字幕在线| 久久久久久久久久一区| 成人在线免费在线观看| 国产精品三级一区二区| 色呦色呦色精品| 成人在线观看黄| 欧美黑人经典片免费观看| 亚洲天堂一区二区在线观看| 欧美黄色一级片视频| 久久久久久免费看| 国产午夜精品视频一区二区三区| 亚洲色图 在线视频| aa在线免费观看| 欧美视频在线观看视频| 精品人妻大屁股白浆无码| www.午夜色| 亚洲一区二区福利视频| 黄色永久免费网站| 青青在线视频免费| 六月丁香婷婷在线| 成人在线免费在线观看| 欧美成人免费在线观看视频| 成人小视频在线观看免费| 国产日产欧美一区二区| 9999在线观看| 中文字幕55页| 少妇久久久久久被弄到高潮| 国产日产欧美一区二区| 三年中国中文在线观看免费播放| 日本美女视频一区| 艳母动漫在线观看| 日韩在线观看a| 免费看国产曰批40分钟| 国产91xxx| 免费男同深夜夜行网站| 欧美日韩亚洲自拍| 亚洲18在线看污www麻豆| 黄频视频在线观看| 丁香婷婷综合激情| 奇米精品一区二区三区| 免费黄色特级片| 尤物国产在线观看| www.国产二区| 无罩大乳的熟妇正在播放| 成人亚洲视频在线观看| 中文字幕 欧美日韩| 国产激情在线看| 日本三区在线观看| 香蕉视频xxxx| www.中文字幕在线| 第四色婷婷基地| 91大学生片黄在线观看| 丰满爆乳一区二区三区| 午夜免费高清视频| 亚洲熟妇无码av在线播放| 日韩一级免费在线观看| 强开小嫩苞一区二区三区网站| 给我免费播放片在线观看| 国产wwwxx| 秋霞无码一区二区| 国产精品av免费| 欧美老熟妇喷水| 看全色黄大色大片| 亚洲国产精品毛片av不卡在线| 一级片黄色免费| 欧美性久久久久| 青青草综合在线| 天天综合成人网| 国产又大又黄又粗的视频| 国产一级大片免费看| 999精品视频在线| 国产一区二区四区| 1314成人网| 亚洲视频一二三四| 青青草av网站| 看av免费毛片手机播放| 日本久久高清视频| 久久出品必属精品| 色天使在线观看| 特级丰满少妇一级| 免费无码av片在线观看| 中国丰满熟妇xxxx性| 男女啪啪的视频| 亚洲欧美日韩一二三区| 日韩中文字幕a| 天天干天天综合| 亚洲免费av一区二区三区| 亚洲午夜精品久久久久久人妖| 99er在线视频| 日韩欧美国产综合在线| 黄页网站大全在线观看| 欧美一级爱爱视频| 日产精品久久久久久久蜜臀| 福利在线小视频| 日韩精品视频在线观看视频| 欧美日韩激情四射| 日本黄大片在线观看| 国产欧美123| 人妻少妇精品久久| 91看片就是不一样| 久久久精品麻豆| 91av视频免费观看| 400部精品国偷自产在线观看| 国产又粗又爽又黄的视频| 亚洲色图都市激情| 成人毛片一区二区| 中文字幕视频在线免费观看| 视频在线观看免费高清| aaa一级黄色片| 丰满的少妇愉情hd高清果冻传媒| www.好吊操| aaa毛片在线观看| 五月婷婷之综合激情| 肉色超薄丝袜脚交| 日韩在线视频在线| 哪个网站能看毛片| 青少年xxxxx性开放hg| 欧美乱大交xxxxx潮喷l头像| www.日本xxxx| 美女av免费观看| 国产一二三四在线视频| 中文字幕精品在线播放| 日本熟妇人妻xxxxx| 国产av不卡一区二区| 欧美,日韩,国产在线| 精品综合久久久久| 成人中文字幕在线播放| 天天操狠狠操夜夜操| 2018国产在线| 色偷偷中文字幕| 北条麻妃在线视频| 欧美黑人在线观看| 日本激情视频在线播放| 欧美视频免费看欧美视频| 伊人免费视频二| 成人免费无码av| 日韩黄色短视频| 乱子伦一区二区| 网站在线你懂的| 男操女免费网站| 国产白丝袜美女久久久久| 亚洲精品国产suv一区88| 精品久久久99| 日韩中文字幕组| 日本福利视频在线| av网站手机在线观看| 路边理发店露脸熟妇泻火| 超碰人人草人人| 国产精品一区二区羞羞答答| 国产超级av在线| 亚洲午夜精品久久久久久人妖| 99亚洲国产精品| 男人草女人视频|