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

时间:2015-01-20 11:32:16

标签: php laravel environment-variables laravel-5

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

APP_ENV=local

根据我在这个主题上阅读的所有内容,所有其他特定于环境的配置都应该放在这个文件中,所以数据库密码,网址等,然后读入主配置数组,如下所示:

env('DB_HOST', 'localhost')

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

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

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

3 个答案:

答案 0 :(得分:7)

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

它现在处理级联配置,因此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);
        }
    }

}

答案 1 :(得分:5)

不得使用.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配置文件夹选项不再可用。

答案 2 :(得分:3)

配置Laravel 5环境很容易。

  1. 打开根应用程序文件夹,找到&#34; .env.example&#34;,
  2. 复制并重命名为&#34; .env&#34;,
  3. 请适应&#34; .env&#34;将文件存入您的环境,
  4. 如果您使用GIT,请确保不要将此文件推送到您的GIT存储库。
  5. 对于完整的解释&#39;,我写了这个配置here

    我引用了dotenv开发者的说法;

      

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