欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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目录结构
Slim研读笔记八之外观模式(上)

第三步,新建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');
});














相关标签: slim 组件

上一篇: VGG论文笔记

下一篇: BERT论文笔记