Laravel加载自定义.env文件后如何同步新环境变量到config配置
问题原因
Laravel 框架在启动阶段就会将所有 .env 中的环境变量读取并注入到配置容器中,后续手动加载新的 env 文件只会更新全局环境变量,不会自动同步到已经初始化完成的 config 配置中,因此会出现 env() 拿到新值、config() 仍返回旧值的情况。
解决方案
方法1:手动覆盖指定配置项(推荐)
如果只有少数配置需要更新,加载完env文件后手动赋值即可,性能开销最低:
$dotenv = \Dotenv\Dotenv::createMutable(base_path(), '.env.landlord'); $dotenv->load(); // 手动同步需要更新的配置项 config([ 'app.name' => env('APP_NAME'), // 其他需要更新的配置按格式补充即可,比如数据库配置 'database.connections.mysql.database' => env('DB_DATABASE'), 'database.connections.mysql.username' => env('DB_USERNAME'), ]);
方法2:重新加载全量配置
如果需要同步所有依赖环境变量的配置,可以重置配置容器重新加载所有配置文件:
$dotenv = \Dotenv\Dotenv::createMutable(base_path(), '.env.landlord'); $dotenv->load(); // 重置配置容器,重新加载所有配置 app()->instance('config', new \Illuminate\Config\Repository( // 已开启配置缓存时读取缓存文件 require base_path('bootstrap/cache/config.php') // 未开启配置缓存时,逐文件加载config目录下的配置 // collect(\File::glob(base_path('config/*.php')))->mapWithKeys(fn ($file) => [ // basename($file, '.php') => require $file // ]) ));
注意:该方法会重置所有配置,包括你之前运行时动态修改的配置值,仅适合完全切换环境的场景。
注意事项
如果你的项目开启了配置缓存(执行过
php artisan config:cache),Laravel 会直接读取缓存的配置文件,不会再读取任何.env文件,此时手动加载env文件无效,建议优先使用方法1手动覆盖配置。
内容的提问来源于stack exchange,提问作者Bálint Bakos
相关产品推荐
相关产品推荐

