理解这个问题之前需楼主去补一波ServiceProvider
的知识点了 :)
问题的关键在于Illuminate\Redis\RedisServiceProvider
:
Laravel在启动RedisServiceProvider
时,会将redis
作为一个单例注册在应用容器中,而生成单例的那一刻,redis
的所有配置已经作为一份拷贝定格在RedisManager
之中了,所以你后面动态填加的redis2
配置是没有效果的。(追踪源码一切就真相大白了^_^)
那么你可能还会问,为什么我的redis1
也是动态填加却效果呢?这是因为RedisServiceProvider
这个服务是一个延迟加载的服务(仔细观察他的$defer
属性是true
),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1
配置是在第一次调用服务(26行)之前配置的,此时redis
单例还未生成,所以这个配置是有效的。
希望能帮到你。
理解这个问题之前需楼主去补一波ServiceProvider
的知识点了 :)
问题的关键在于Illuminate\Redis\RedisServiceProvider
:
Laravel在启动RedisServiceProvider
时,会将redis
作为一个单例注册在应用容器中,而生成单例的那一刻,redis
的所有配置已经作为一份拷贝定格在RedisManager
之中了,所以你后面动态填加的redis2
配置是没有效果的。(追踪源码一切就真相大白了^_^)
那么你可能还会问,为什么我的redis1
也是动态填加却效果呢?这是因为RedisServiceProvider
这个服务是一个延迟加载的服务(仔细观察他的$defer
属性是true
),延迟加载的意义就在于第一次使用时才去加载服务。在你的代码里redis1
配置是在第一次调用服务(26行)之前配置的,此时redis
单例还未生成,所以这个配置是有效的。
希望能帮到你。
提供一条参考思路:修改配置后,重新绑定一次redis
单例,然后清除Facade实例即可。
use Illuminate\Redis\RedisManager;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;
app()->singleton('redis', function ($app) {
$config = $app->make('config')->get('database.redis');
return new RedisManager(Arr::pull($config, 'client', 'predis'), $config);
});
Facade::clearResolvedInstance('redis');
(或许还有更好的方法)
@英雄没有斗篷
5.3及以前的版本换成Illuminate\Redis\Database
应该就好了:
use Illuminate\Redis\Database;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;
app()->singleton('redis', function ($app) {
return new Database($app['config']['database.redis']);
});
Facade::clearResolvedInstance('redis');
推荐文章: