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

Php 如何为dotenv创建特定于环境的.env文件(在Laravel 5中),php,laravel,environment-variables,laravel-5,Php,Laravel,Environment Variables,Laravel 5,我刚刚开始使用Laravel5,它使用dotenv库。这使用项目根目录中的.env文件,该文件使用以下行设置环境: APP_ENV=local 根据我在本主题上阅读的所有内容,所有其他特定于环境的配置都应放在该文件中,因此数据库密码、URL等将被读入主配置数组,如下所示: env('DB_HOST', 'localhost') 虽然我觉得这可能适用于一些特定的事情,比如您可能不希望提交的数据库密码,但我真正想要的是能够为每个环境提交我的大部分或所有不同的环境值 因此,我希望.env将APP_

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

APP_ENV=local
根据我在本主题上阅读的所有内容,所有其他特定于环境的配置都应放在该文件中,因此数据库密码、URL等将被读入主配置数组,如下所示:

env('DB_HOST', 'localhost')
虽然我觉得这可能适用于一些特定的事情,比如您可能不希望提交的数据库密码,但我真正想要的是能够为每个环境提交我的大部分或所有不同的环境值

因此,我希望.env将APP_env定义为“local”、“staging”或“production”,然后有一个包含这些值的.local.env或.env.local文件,然后我可以提交这些值,并根据APP_env加载正确的文件

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

你不必对所有事情都使用
.env
。有几个选择

选项1-仅对变量使用
.env

'default' => env('DB_CONNECTION'),
选项2-仅对变量使用
.env
,如果不存在,则使用系统默认值

'default' => env('DB_CONNECTION', 'mysql'),
选项3-只需硬编码变量,而不是通过
.env

'default' => 'mysql',
对于大多数配置选项,选项2可能是最好的。您仍然可以为您的配置定义(并提交)一个选项到git repo,但是如果您愿意,您可以在将来的任何
.env
文件中轻松地覆盖它

选项1特别适用于密码、应用程序密钥等,因此它们永远不会提交给您的git回购

选项3用于一些配置变量,您知道这些变量永远不会改变


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

最后通过修改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);
        }
    }

}

很容易配置Laravel 5环境

  • 打开根应用程序文件夹并查找“.env.example”
  • 复制并重命名为“.env”
  • 请将“.env”文件放入您的环境中
  • 如果使用GIT,请确保不要将此文件推送到GIT存储库
  • 为了“完整的解释”,我写了这个配置

    我引用dotenv开发者的话

    phpdotenv是为开发环境而设计的,通常应该 不可用于生产。在生产中,实际环境 应设置变量,以避免加载 .env文件。这可以通过一个自动化系统来实现 使用诸如Vagrant、chef或Puppet之类的工具部署过程,或者 使用云主机(如Pagodabox和Heroku)手动设置


    谢谢我不喜欢这种新方法,我想我将定义一个函数,它将加载本地、暂存等文件夹,并像旧方法一样层叠阵列。毕竟,它们是PHP文件,因此可以通过编程方式定义数组。刚刚开始。在我的“laravel”文件夹中哪里可以获得.ENV文件?OP询问如何为每个环境(如开发、测试和生产)创建一个单独的.ENV文件。我更新了我的答案(添加了开发人员的报价)。因此,每台机器只有一个.env。在生产环境中,您不应该使用.env文件。事实上,您不应该拥有
    .production.env
    ,但您可以拥有
    .specialenv.env
    ,它可以复制到
    .env
    ,以便使用这些设置。