我正在开发一个 Laravel 11 项目,我需要设置可通过
config
方法访问的环境感知配置。例如,我在 constant.php
目录中有一个 config
文件用于常规配置,在 constant.php
目录中有一个 config/production
文件用于特定于生产的配置。
这是目录结构:
config/
constant.php
config/production/
constant.php
我想实现以下目标:
config('constant')
在本地和临时环境中,仅加载
config/constant.php
。
在生产环境中,加载
config/constant.php
和 config/production/constant.php
,其中 config/production/constant.php
覆盖 config/constant.php 中的任何重叠配置。
如何配置 Laravel 11 来实现这种环境感知的配置加载?
代码示例或任何具体方法将不胜感激!
其他背景:
我熟悉 Laravel 的 env() 函数和配置缓存,但我不确定如何实现这种基于环境的选择性配置加载。
哦,我解决了:) 要在 Laravel 11 中创建环境感知配置,您可以在
AppServiceProvider
中扩展配置存储库。该方法根据当前环境动态地将特定于环境的配置与通用配置合并。
$this->app->extend('config', function (\Illuminate\Contracts\Config\Repository $configRepository) {
$environment = $this->app->environment();
$envConfigPath = config_path($environment);
if (is_dir($envConfigPath)) {
$finder = new \Symfony\Component\Finder\Finder();
$finder->files()->name('*.php')->in($envConfigPath);
foreach ($finder as $file) {
$filename = $file->getBasename('.php');
$generalConfig = $configRepository->get($filename, []);
$envConfig = require $file->getRealPath();
$mergedConfig = array_merge($generalConfig, $envConfig);
$configRepository->set($filename, $mergedConfig);
}
}
return $configRepository;
});