引言
接上篇文章Laravel源碼分析IOC容器提到的內容,可以使用ioc->make('user')
來創建一個$user
實例,在通過$user->login()
來調用實例方法,但是還能不能更方便一點,直接調用通過UserFacede::login()
方式直接調用呢?
Facade
外觀(Facade)模式的定義:是一種通過爲多個複雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的複雜度,提高了程序的可維護性。
Facades實現原理
- Facade 核心實現原理就是在 UserFacade 提前注入 Ioc 容器。
- 通過定義一個服務提供者的外觀類,在該類定義一個類的變量,跟 ioc 容器綁定的 key 一樣,
- 通過靜態魔術方法__callStatic 可以得到當前想要調用的 login
- 使用 static::$ioc->make (‘user’);
代碼示例:
<?php
class UserFacades
{
protected static $ioc;
public static function setFacadeIoc($ioc)
{
static::$ioc = $ioc;
}
/**
* 返回User在IOC容器中綁定的KEY
* @return string
*/
protected static function getFacadeAccessor()
{
return 'user';
}
/**
* __callStatic 當調用的靜態方法不存在或權限不足時,會自動調用__callStatic方法。
* @param $method
* @param $arguments
* @return mixed
*/
public static function __callStatic($method, $arguments)
{
// 通過ioc容器拿到對應的實例
$instance = static::$ioc->make(static::getFacadeAccessor());
// 通過實例來調用指定方法
return $instance->$method(...$arguments);
}
}
UserFacades::login();
通過預先綁定一個ioc容器,當通過UserFacade::login()
調用方法時,如果login
方法不存在,則會調用魔術方法, 魔術方法通過預先綁定的ioc容器和預先指定的ioc
容器綁定的key
拿到一個實例對象,再進行調用。