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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章