在 Laravel 應(yīng)用中,F(xiàn)acade 就是一個(gè)可以從容器訪問對象的類。其中核心的部件就是 Facade 類。不管是 Laravel 自帶的 Facades,還是自定義的 Facades,都繼承自 Illuminate\Support\Facades\Facade
類。
Facade 基類使用了__callStatic()
魔術(shù)方法,直到對象從容器中被解析出來后,才會進(jìn)行調(diào)用。
webman已經(jīng)有安裝Illuminate相關(guān)擴(kuò)展包,我們只要重寫__callStatic()
魔術(shù)方法即可實(shí)現(xiàn),其實(shí)很簡單,就是把自定義的xxFacade類注入到容器中即可。
廢話不多說,開整
1,安裝illuminate/container
擴(kuò)展
composer require illuminate/container
2,創(chuàng)建app\Facade\Facade.php
門面類
<?php
namespace app\Facade;
use Illuminate\Support\Facades\Facade as MainFacade;
use support\Container;
/**
* 以服務(wù)容器方式重寫
*
* @package app\Facade
*/
class Facade extends MainFacade
{
/**
* 重寫私有魔術(shù)方法
*
* @return mixed
*/
public static function __callStatic($method, $args)
{
if (!Container::has(static::getFacadeAccessor())) {
Container::make(static::getFacadeAccessor(), $args);
}
return Container::get(static::getFacadeAccessor())->$method(...$args);
}
}
3,創(chuàng)建一個(gè) app\Facade\TestFacade
,只要繼承重寫的Facade即可
<?php
namespace app\Facade;
use app\Facade\Accessor\TestAccessor;
/**
* Class TestFacade
* @method static set($data)
* @method static get()
* @package app\Facade
*/
class TestFacade extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return TestAccessor::class;
}
}
4,創(chuàng)建實(shí)現(xiàn) app\Facade\Accessor\TestAccessor
實(shí)現(xiàn)類
<?php
namespace app\Facade\Accessor;
/**
* Class TestAccessor
* @package app\Facade\Accessor
*/
class TestAccessor
{
/**
* @var $data
*/
private $data;
/**
* 設(shè)置
*
* @param $data
* @return $this
*/
public function set($data): TestAccessor
{
$this->data = $data;
return $this;
}
/**
* 獲取
*
* @return mixed
*/
public function get()
{
return $this->data;
}
}
5,現(xiàn)在就可以像laravel一樣使用門面類了
## 設(shè)置數(shù)據(jù)
TestFacade::set('hello');
## 獲取數(shù)據(jù)
TestFacade::get()
昨天用webman做一個(gè)小業(yè)務(wù),看了下社區(qū)沒有合適的插件和分享,就簡單的處理下。不對的地方望指正,有時(shí)間的伙伴可以按這個(gè)思路將其封裝插件或擴(kuò)展包,方便需要用的伙伴使用。
感謝
Facades 解決了什么問題