Laravel facade
概述
在laravel中,facade作爲容器中類的靜態代理,它可以讓你以靜態的方式調用容器中的任何對象的任何方法。
實現了對類的快捷訪問的一種方式。
原理簡單說就是,我們創建一個門面類,繼承自門面抽象類,重寫一個方法,返回內容是綁定到容器的服務名稱。然後在程序中以【門面類::方法】的靜態方式調用,門面父類獲取到我們調用的靜態方法,然後通過子類重寫的那個方法獲取到在容器中的服務名稱,然後從容器中把這個服務make出來,然後用該服務調用該服務的方法。
框架中的例子
比如最常用的寫log,facade用法
\Log::info('xxx');
從容器中取出使用的用法:
app('log')->info('xxx');
由上可見,使用facade方式調用類更加簡單直觀。
框架中所有內置的facade類都在vendor/laravel/framework/src/Illuminate/Support/Facades
目錄下:
他們都繼承了Facade這個抽象類。
然後在config/app.php配置文件的aliases數組中配置了別名,use時只需use別名即可。
定義自己的facade
這裏使用上一篇文章中建立的SMS服務提供者的基礎上繼續。
https://blog.csdn.net/u012628581/article/details/102013623
這次增加一個門面,以門面的方式調用上次建立的那個服務提供者中的sms類。
首先在app文件夾下創建Facades文件夾,裏面存儲我們要存放的門面,也就是facade。
然後在文件夾內創建一個smsFacade.php:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
/**
* @see \App\Repositories\Interfaces\SMSInterface
*/
class smsFacade extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'App\Repositories\Interfaces\SMSInterface';
}
}
然後在config/app.php的aliases數組配置中增加別名:
'smsFacade' => App\Facades\smsFacade::class,
然後在其他類中就可以以門面的方式進行使用了:
\smsFacade::send('xxx');
是不是很簡單呢!
也就是說,我們建立的門面,裏邊那個getFacadeAccessor方法返回容器中綁定的服務名稱,然後門面會調用容器,用我們調用的靜態方法,去調用從容器中make出來的實例的方法。
參考鏈接
https://learnku.com/docs/laravel/5.8/facades/3888
https://segmentfault.com/a/1190000009369566
https://learnku.com/articles/6413/facade-facade-appearance-note