Facades 外观模式背后实现原理
外观模式Facade理解
上一节我们讲到需要$ioc->make('user')
才能拿到User
的实例,再去使用$user->login();
那能不能更方便点,比如下面的用法,是不是很方便。
UserFacade::login();
Facade工作原理
- Facede 核心实现原理就是在UserFacade提前注入IoC容器。
- 定义一个服务提供者的外观类,在该类定义一个类的变量,跟ioc容器绑定的key一样,
- 通过静态魔术方法__callStatic可以得到当前想要调用的login
- 使用static::$ioc->make('user');
具体实现Facade
1.我们定义一个User的外观类UserFacade
class UserFacade
{
// 维护Ioc容器
protected static $ioc;
public static function setFacadeIoc($ioc)
{
static::$ioc = $ioc;
}
// 返回User在Ioc中的bind的key
protected static function getFacadeAccessor()
{
return 'user';
}
// php 魔术方法,当静态方法被调用时会被触发
public static function __callStatic($method, $args)
{
$instance = static::$ioc->make(static::getFacadeAccessor());
return $instance->$method(...$args);
}
}
//实例化IoC容器
$ioc = new Ioc();
$ioc->bind('log','FileLog');
$ioc->bind('user','User');
UserFacade::setFacadeIoc($ioc);
UserFacade::login();
如果有对__callStatic魔术方法不太明白的,可以查看php文档
为什么要使用Facades
有的同学说,使用Facede那不是更加麻烦了啊,还需要注入ioc容器,还得需要用魔术方法。
其实laravel在框架运行的时候这些步骤都帮我们自动加好了,我们只需要使用UserFacade::login();就可以了。
使用Facades其实最主要的就是它提供了简单,易记的语法,从而无需手动注入或配置长长的类名。此外,由于他们对 PHP 静态方法的独特调用,使得测试起来非常容易。
好了我们这个章节的内容就到这里。
3 Comments
$instance->$method(...$args); 括号里面为什么要加三个点?
哥们 文章通俗易懂 不错!
搜索一下:PHP可变数量的参数列表。就是把数组拆成单个元素依次当成函数参数