machaven/laravel-cascading-config

Laravel 5 的多级环境配置文件支持

1.0 2017-11-24 20:38 UTC

This package is auto-updated.

Last update: 2024-09-10 19:24:34 UTC


README

为什么? - .env 问题

当持续开发和扩展一个 Laravel 应用时,你可能发现你的 .env 文件变得很大且难以维护。当有多个包含 .env 变更的分支部署时,合并所有的 .env 变更和更新实时 .env 文件变得噩梦一般。

这迫使我重新思考配置和 .env 文件中真正重要的内容。

在你的 .env 文件中应保留什么

  • 标准的 Laravel .env 设置
  • 敏感信息,如其他 api 的登录凭证。

从 .env 文件中移除什么

  • 所有可能很少更改的自定义设置。

为什么使用级联配置文件?

  1. 级联配置文件允许你为每个环境保留一组配置文件。所有环境配置覆盖了配置文件夹中的基本配置。这允许你为每个环境设置动态配置。

  2. 设置更改可以记录在拉取请求中。这防止了仅在服务器 .env 文件上更改时设置更改丢失。

此外,如果你在配置文件中使用 env() 函数,它将允许你在 .env 文件中存在的情况下,用变量覆盖配置文件中的任何默认设置。

安装

通过 composer 安装此包

composer require machaven/laravel-cascading-config

安装后,将 ServiceProvider 添加到 app/config/app.php 中的 providers 数组(对于 Laravel 5.5+ 不是必需的)

Machaven\LaravelCascadingConfig\CascadingConfigProvider::class,

如何工作

服务提供程序将检查 .env 文件中配置的环境是否存在目录。如果环境文件夹存在,则将从该文件夹中读取所有配置文件,并将其合并到配置文件夹中的配置。

级联配置文件示例

首先,在你的标准 Laravel config/ 文件夹中创建默认配置文件。

config/example.php

现在创建一个文件夹以覆盖环境的 example 配置。可以为 APP_ENV 中定义的任何环境创建一个文件夹。在这个示例中,我们使用 local

config/local/

现在在本地文件夹中创建另一个 example 配置

config/local/example.php

配置文件内容示例

config/example.php

<?php

return [
    'clientApi' => [
        'curlTimeout' => env('CLIENT_API_CURL_TIMEOUT', 5),
        'baseUrl' => env('CLIENT_API_BASE_URL', 'http://test.com/api/'),
        'username' => env('CLIENT_API_USERNAME'), // Always read username and password from .env
        'password' => env('CLIENT_API_PASSWORD'),
    ],
    'test' => env('TEST', 'prod'),
];

config/local/example.php

<?php

return [
    'clientApi' => [
        'baseUrl' => env('CLIENT_API_BASE_URL', 'http://test.local/api/'),
    ],
    'test' => env('TEST', 'local'),
];

在上面的本地配置中,我们没有覆盖 curlTimeout 数组键。

配置文件结果示例

当 APP_ENV 为 local 时

>>> config('example');
=> [
     "clientApi" => [
       "curlTimeout" => 5, // This is merged from the config/example.php config file
       "baseUrl" => "http://test.local/api/",
       "username" => "username in .env file",
       "password" => "password in .env file",
     ],
     "test" => "local",
   ]

当 APP_ENV 为 prod 时

>>> config('example');
=> [
     "clientApi" => [
       "curlTimeout" => 5,
       "baseUrl" => "http://test.com/api/",
       "username" => "username in .env file",
       "password" => "password in .env file",
     ],
     "test" => "prod",
   ]

如你所见,上面的文件没有被 config/local/ 文件夹中的文件覆盖。

当 APP_ENV 为 prod 且 .env 文件中添加了 TEST='ENV FILE' 时

>>> config('example');
=> [
     "clientApi" => [
       "curlTimeout" => 5,
       "baseUrl" => "http://test.com/api/",
       "username" => "username in .env file",
       "password" => "password in .env file",
     ],
     "test" => "ENV FILE",
   ]

此处测试键被 .env 文件中的 TEST 变量覆盖。这是因为我们在配置文件中使用 env() 辅助函数来覆盖任何环境的设置;如果它们存在于 .env 中。