如何为 dotenv 获取特定于环境的 .env 文件(在 Laravel 5 中)

Posted

技术标签:

【中文标题】如何为 dotenv 获取特定于环境的 .env 文件(在 Laravel 5 中)【英文标题】:How to have environment specific .env files for dotenv (in Laravel 5) 【发布时间】:2015-03-18 14:54:10 【问题描述】:

我刚刚开始使用使用 dotenv 库的 Laravel 5。这使用项目根目录中的 .env 文件,该文件使用以下行设置环境:

APP_ENV=local

根据我读到的关于这个主题的所有内容,所有其他特定于环境的配置都应该放在这个文件中,所以数据库密码、url 等,然后像这样读入主配置数组:

env('DB_HOST', 'localhost')

虽然我觉得这可能适用于您可能不想提交的数据库密码等一些特定的事情,但我真正想要的是能够为每个环境提交大部分或全部不同的环境值。

因此,我想要 .env 将 APP_ENV 定义为“本地”、“暂存”或“生产”,然后拥有一个包含这些值的 .local.env 或 .env.local 文件,然后我可以提交并提交将根据 APP_ENV 加载正确的文件。

这可能吗? Laravel 4 有级联配置数组,看起来更灵活,但如果我可以有一个环境 .env 文件,那么我可以忍受。

【问题讨论】:

【参考方案1】:

您不必必须对所有事情都使用.env。有几个选项。

选项 1 - 仅将 .env 用于变量

'default' => env('DB_CONNECTION'),

选项 2 - 仅将 .env 用于变量,但如果不存在则使用系统默认值

'default' => env('DB_CONNECTION', 'mysql'),

选项 3 - 只需对变量进行硬编码,而不是通过 .env 使其可设置

'default' => 'mysql',

选项 2 可能是大多数配置选项的最佳选择。您仍然可以为您的 git 存储库定义(并提交)一个选项 - 但如果您愿意,将来可以在任何 .env 文件中轻松覆盖它。

选项 1 最适合专门用于密码、应用程序密钥等 - 因此它们永远不会提交到您的 git 存储库。

选项 3 适用于一些您知道永远不会改变的配置变量。

注意 - 级联 Laravel 4 配置文件夹选项不再可用。

【讨论】:

谢谢。我不喜欢这种新方法,我想我会定义一个函数,它将加载本地、暂存等文件夹并像旧方法一样级联数组。毕竟,它们是 php 文件,因此可以通过编程方式定义数组。 我在 Laravel 本地工作。刚刚开始。我在哪里可以在我的“laravel”文件夹中获取 .ENV 文件?【参考方案2】:

最后通过修改app/Providers/ConfigServiceProvider.php解决了。当您创建项目时,此文件将作为存根添加到您的应用文件夹中,用于覆盖配置值。

它现在处理级联配置,因此 config/local/app.php 中的任何值都将覆盖 config/app.php。正如下面的评论所说,它不处理环境配置中的匹配数组,只会替换。但我可以在需要时解决它。

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Symfony\Component\Finder\Finder;

class ConfigServiceProvider extends ServiceProvider 

    /**
     * Overwrite any vendor / package configuration.
     *
     * This service provider is intended to provide a convenient location for you
     * to overwrite any "vendor" or package configuration that you may want to
     * modify before the application handles the incoming request / command.
     *
     * Modified 2014-01-20 to allow environment specific configs to be loaded
     * from app/config/[environment]/ which will cascade over the base configs.
     *
     * @return void
     */
    public function register()
    
        $config = app('config');
        $envPath = app()->configPath() . '/' . getenv('APP_ENV');

        foreach (Finder::create()->files()->name('*.php')->in($envPath) as $file)
        
            $configName = basename($file->getRealPath(), '.php');
            $oldConfigValues = $config->get($configName);
            $newConfigValues = require $file->getRealPath();

            // Replace any matching values in the old config with the new ones.
            // Doesn't yet handle matching arrays in the config, it will just replace them.
            $config->set($configName, $newConfigValues + $oldConfigValues);
        
    


【讨论】:

【参考方案3】:

轻松配置 Laravel 5 环境。

    打开您的根应用程序文件夹并找到“.env.example”, 复制并重命名为“.env”, 请将“.env”文件放入您的环境中, 如果您使用 GIT,请确保不要将此文件推送到您的 GIT 存储库。

为了'完整的解释',我写了这个配置here。

我引用 dotenv 开发者的话;

phpdotenv 是为开发环境而设计的,通常应该 不能用于生产。在生产中,实际环境 应该设置变量,以便没有加载 每个请求的 .env 文件。这可以通过自动化来实现 使用 Vagrant、chef 或 Puppet 等工具的部署过程,或者可以是 使用 Pagodabox 和 Heroku 等云主机手动设置。

【讨论】:

OP 询问如何为每个环境(例如开发、测试和生产)创建一个单独的 .env 文件。 我更新了我的答案(添加了开发人员的报价)。因此,每台机器只有一个 .env。在生产中,你不应该使用 .env 文件。 确实,您永远不应该拥有.production.env,但您可以拥有可以复制到.env.specialenv.env,以便使用这些设置。

以上是关于如何为 dotenv 获取特定于环境的 .env 文件(在 Laravel 5 中)的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 ElasticBeanstalk 环境唯一的 DynamoDB 表名添加前缀

dotenv 在生产中需要 .env 文件

使用 Python 和 dotenv 更改保存在 .env 文件中的环境变量

如何为不同的请求建模不同类型的表单

Flutter加载不同的环境变量获取不同的配置参数

如何为 rspec 设置 ENV 变量?