machaven / laravel-cascading-config
Laravel 5 的多级环境配置文件支持
Requires
- php: >=5.5.9
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 文件中移除什么
- 所有可能很少更改的自定义设置。
为什么使用级联配置文件?
-
级联配置文件允许你为每个环境保留一组配置文件。所有环境配置覆盖了配置文件夹中的基本配置。这允许你为每个环境设置动态配置。
-
设置更改可以记录在拉取请求中。这防止了仅在服务器 .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 中。