如何在 Laravel 11 中创建环境感知配置?

问题描述 投票:0回答:1

我正在开发一个 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() 函数和配置缓存,但我不确定如何实现这种基于环境的选择性配置加载。

php laravel configuration environment
1个回答
0
投票

哦,我解决了:) 要在 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;
});
© www.soinside.com 2019 - 2024. All rights reserved.