Slim研读笔记八之外观模式(上)
程序员文章站
2024-03-15 09:26:17
...
今天柚子深入学习了Laravel的外观模式,这节让我们带着问题去学习Slim的外观模式。
问题1.外观模式为何可以快速指定到类?
问题2.Slim如何集成外观模式?
问题1
外观模式大量使用PHP的后期静态绑定即父类定义的属性子类可以直接使用。外观模式Facade抽象类的__callStatic魔术方法是关键。
问题2
实现Slim的外观模式,使用Facade做服务容器内基类的静态代理。使用各种服务基类会更加方便易用。譬如:Cache::get($name)方法,若查看Cache类会发现,类中并不存在get()静态方法,实质是从依赖注入容器中获取了cache服务基类$instance = $app->get(‘cache’)之后,执行了$instance->get($name);
Slim要想实现外观模式,必须考虑两个问题
1.外观模式核心类及服务容器的外观模式类的加载位置(可手写php加载器,这里推荐使用Composer)
2.在应用主体$app的整个生命周期中,应该在各类服务已经注入到容器之后及路由执行之前,将$app赋值给Facade基类的$app方法。(这里Facache的$app属性赋值采用后期静态绑定方式)
Slim本身不具备外观模式。但我们可以重写Facade类,实现专属于Slim的外观模式。
第一步,编辑composer.json,将App命名空间与app目录映射。
{
"require": {
"slim/slim": "^3.9",
"monolog/monolog": "^1.23",
"illuminate/database": "~5.1",
"slim/twig-view": "^2.3"
},
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
第二步,建立app目录结构
第三步,新建Facade类,该类重写了\Illuminate\Support\Facades\Facade类。
<?php
namespace App\Facade;
class Facade extends \Illuminate\Support\Facades\Facade
{
/**
* 重写\Illuminate\Support\Facades\Facade该方法
* @param object|string $name
* @return object|string
*/
protected static function resolveFacadeInstance($name)
{
if (is_object($name)) {
return $name;
}
if (isset(static::$resolvedInstance[$name])) {
return static::$resolvedInstance[$name];
}
//return static::$resolvedInstance[$name] = static::$app[$name];
return static::$resolvedInstance[$name] = static::$app->getContainer()->$name;
}
}
第四步,实现一个LogFacade.php,并使用该外观类。
<?php
namespace App\Facade;
class LogFacade extends Facade
{
public static function getFacadeAccessor()
{
return "logger";
}
}
第五步,加载外观模式并使用该模式。// 外观模式加载
\Illuminate\Support\Facades\Facade::clearResolvedInstances();
\Illuminate\Support\Facades\Facade::setFacadeApplication($app);
$app->get('/facade', function () {
\App\Facade\LogFacade::addInfo('haha');
});
推荐阅读