动态修改 Laravel Config 配置项
感谢以下网站提供的帮助
基于 Laravel 开发过程中,ThinkSNS+ 是如何做到 Laravel 配置可以网站后台配置的。
Laravel
的 config
配置文件都是写死在 php
文件中,一般人需要了解 Laravel
才能修改其中的配置。修改上线后的网站配置也很麻烦。如果能通过后台去修改就很方便。
从上面的教程中可以知道这是可以实现的。他通过读取一个 .yml
文件中的配置到达修改的目的, 笔者根据文中思路,实现通过 redis
去存读取修改配置。
1 config
文档
Laravel 文档 起步 —— 配置 在文档中提到,
运行时设置配置值.png笔者将通过全局辅助函数 config()
方法去修改配置值,并不是直接去修改 config
文件中写死的值。
2 何时去修改配置
先看项目中的 bootstrap\app.php
文件中的 bootstrapWith
方法。
每次循环都会触发两个事件 'bootstrapping: '.$bootstrapper
和 'bootstrapped: '.$bootstrapper
一个是加载前,一个是加载完成事件。再往下看就会看到事件的监听方法。
参数是监听的类和回调事件。
3 $bootstrappers
数组
上面提到 bootstrapWith
的方法会去加载 $bootstrappers
数组中的元素,该数组是在 Kernel.php
文件中。找到 app\Http\Kernel.php
,进入它的父类 Illuminate\Foundation\Http\Kernel
。就能看到 $bootstrappers
数组中的元素
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class
作用是加载 env
文件
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class
作用是加载 config
文件夹下的所有配置。
4 读取 redis
笔者把监听 LoadConfiguration
回调直接写在 bootstrap\app.php
。当 LoadConfiguration
加载完成就会触发,
在回调中 cache
类并没有初始化好。所以笔者通过 predis
去读取。
$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()
方法去执行。