美文网首页Laravel程序员我爱编程
动态修改 Laravel Config 配置项

动态修改 Laravel Config 配置项

作者: 3275508ab630 | 来源:发表于2018-05-18 20:34 被阅读335次

    感谢以下网站提供的帮助
    基于 Laravel 开发过程中,ThinkSNS+ 是如何做到 Laravel 配置可以网站后台配置的。

    Laravelconfig 配置文件都是写死在 php 文件中,一般人需要了解 Laravel 才能修改其中的配置。修改上线后的网站配置也很麻烦。如果能通过后台去修改就很方便。

    从上面的教程中可以知道这是可以实现的。他通过读取一个 .yml 文件中的配置到达修改的目的, 笔者根据文中思路,实现通过 redis 去存读取修改配置。

    1 config 文档

    Laravel 文档 起步 —— 配置 在文档中提到,

    运行时设置配置值.png

    笔者将通过全局辅助函数 config() 方法去修改配置值,并不是直接去修改 config文件中写死的值。

    2 何时去修改配置

    先看项目中的 bootstrap\app.php 文件中的 bootstrapWith 方法。

    bootstrapWith.png

    每次循环都会触发两个事件 'bootstrapping: '.$bootstrapper'bootstrapped: '.$bootstrapper 一个是加载前,一个是加载完成事件。再往下看就会看到事件的监听方法。

    bootstrapping.png

    参数是监听的类和回调事件。

    3 $bootstrappers 数组

    上面提到 bootstrapWith 的方法会去加载 $bootstrappers 数组中的元素,该数组是在 Kernel.php 文件中。找到 app\Http\Kernel.php,进入它的父类 Illuminate\Foundation\Http\Kernel。就能看到 $bootstrappers 数组中的元素

    bootstrappers.png

    \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class 作用是加载 env 文件
    \Illuminate\Foundation\Bootstrap\LoadConfiguration::class 作用是加载 config 文件夹下的所有配置。

    4 读取 redis

    笔者把监听 LoadConfiguration 回调直接写在 bootstrap\app.php。当 LoadConfiguration 加载完成就会触发,

    afterBootstrapping.png

    在回调中 cache 类并没有初始化好。所以笔者通过 predis 去读取。

    predis.png
    $app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($app) {
        //链接 redis
        $redis = new Predis\Client(config('database.redis.cache'));
    
        //拿到缓存前缀,默认是 str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
        //上面可以看到 laravel 会将 app.name 做前缀,所以 app.name 最好别用中文,或者修改默认的缓存前缀
        $prefix = config('cache.prefix');
    
        //再加入特定前缀来识别我们的动态加载项,`laravel_config_` 可以自己随便修改
        $prefix = !empty($prefix) ? $prefix . ':' . 'laravel_config_' : 'laravel_config_';
    
        //获取所有加载项的key
        $arr = $redis->keys($prefix . '*');
    
        //执行config方法,注意的是 key 去掉前缀 redis 获取到的值要执行 unserialize() 方法
        foreach ($arr as $item) {
            config([str_after($item, $prefix) => unserialize($redis->get($item))]);
        }
    
        //关闭连接
        $redis->disconnect();
    });
    

    这里再补充一下 Redis 没有官方的 Windows 版本,但是微软开源技术团队(Microsoft Open Tech group)开发和维护着这个 Win64 的版本,https://github.com/MicrosoftArchive/redis/releases。推荐一个图形工具 https://redisdesktop.com/

    从上面可以看到,并不是说所以的配置项都推荐动态修改。redis 的链接、缓存的前缀都是不能去改的。看网站运营需求,只放一些上去可以修改的值。

    5 后台对配置的修改

    这里笔者不在贴增删改查代码,放一下配置存入缓存的代码。

    cache.png
    $prefix = 'laravel_config_';
    
    foreach($data as $k => $v) {
       cache()->forever($prefix . $k, $v);
    }
    

    注意点就是加上特定的前缀,$k 是通过用过 . 点方式访问的配置键。这样读取后方便生成键值对给 config() 方法去执行。

    相关文章

      网友评论

        本文标题:动态修改 Laravel Config 配置项

        本文链接:https://www.haomeiwen.com/subject/gekndftx.html