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

Gnu*_*fo1 5 php environment-variables laravel laravel-5

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

APP_ENV=local
Run Code Online (Sandbox Code Playgroud)

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

env('DB_HOST', 'localhost')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gnu*_*fo1 7

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

}
Run Code Online (Sandbox Code Playgroud)


Lau*_*nce 5

你不必须使用.env一切.有几个选择.

选项1 - 仅.env用于变量

'default' => env('DB_CONNECTION'),
Run Code Online (Sandbox Code Playgroud)

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

'default' => env('DB_CONNECTION', 'mysql'),
Run Code Online (Sandbox Code Playgroud)

选项3 - 只需对您的变量进行硬编码,而不是通过 .env

'default' => 'mysql',
Run Code Online (Sandbox Code Playgroud)

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

选项1最适合密码,应用程序密钥等 - 因此它们永远不会被提交到您的git仓库.

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

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