【应用插件联想】最小化改动代码情况下快速兼容或集成之config使用

taozywu

背景

前段时间walkor出了应用插件这一重大升级特性后,看到后非常棒!很多独立应用或项目就可以很愉快的直接集成进来。

当然如果之前代码不是webman代码,可能需要一些小小的调整及改动,就算使用composer去安装第三方相应包后,我们发现除了需要调整类似db、redis等配置信息外,获取配置需要在前面要加上(Eg. plugin.xx.app.debug)类似这样来获取,程序中如果只是少量使用config()还好一些,如果有很多,可能就需要批量替换。是否有其它办法呢?

办法猜想

能不能不去批量替换config()里面的配置信息?
Eg: config("app.debug") ==> config("plugin.statistic.app.debug")

根据这个假想,我尝试了以下几个办法

再造config()方法

在应用插件里面的function.php

function.php

<?php

namespace plugin\statistic {

    function config($key, $default) {
        return \config("plugin.statistic.$key", $default);
    }
}

使用

\plugin\statistic\config("app.debug");

等同
\config("plugin.statistic.app.debug")

修改config()方法

/**
 * @param string|null $key
 * @param $default
 * @return array|mixed|null
 */
function config(string $key = null, $default = null)
{
    if (\substr($key, 0, 6) !== "plugin") {
        $plugin_app = Config::get("plugin.app");
        $key = $plugin_app ? "plugin.$plugin_app.$key" : $key;
    }
    return Config::get($key, $default);
}

利用各自应用插件中的中间件

<?php
namespace plugin\statistic\app\middleware;

use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use Webman\Config;

class Test implements MiddlewareInterface
{
    public function process(Request $request, callable $handler) : Response
    {
        echo '这里是请求穿越阶段,也就是请求处理前';

        //设置插件app
        Config::set("plugin.app", "statistic");

        echo '这里是请求穿越阶段,也就是请求处理前2';

        $response = $handler($request); // 继续向洋葱芯穿越,直至执行控制器得到响应

        echo '这里是响应穿出阶段,也就是请求处理后';

        return $response;
    }
}

从上面可以看到有使用到Config::set(),此方法可以参考之前分享的一篇 简易版Config-set使用及说明

使用

继续使用config()即可

最后

以上仅是个人拙见,欢迎一起来讨论!

725 1 0
1个评论

xiuwang

感觉还是ide 正则批量替换简单,反正db那些都要替换,顺便就都替换了

  • taozywu 2022-10-11

    你说的也有道理,因人而异

taozywu

3359
积分
0
获赞数
0
粉丝数
2016-01-05 加入
🔝