在 Laravel 5 中设置 ENV 变量的正确方法是什么?

在laravel 4中,我们有:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));

默认情况下。

但在 laravel 5 中,它被更改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

此外,他们还排除了 .gitignore 中的 .env.* 行,现在它具有:

.env

并添加了文件 .env.example:

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead

那么,如果我有超过2个环境,我现在是否必须将它们全部设置在一个.env文件中?例如:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

如果我没有.env文件,laravel如何知道我正在使用什么环境?


答案 1

你可以像在Laravel 4中一样做:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));

*.env文件仅用于将不应放入VCS的敏感数据。在Laravel 4中也是如此

但似乎在最后几天默认检测环境已更改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

因此,您可以使用PC名称或ENV文件中的设置变量。

如果在主 env 文件中使用基于 ENV 的环境检测(默认情况下,您需要添加:.env

APP_ENV=local

当然这里是本地环境,可以把它改成或者localproductiondev

目前,我看到的最重要的问题是,在进行生产时,您需要记住将此文件内容从更改为,因此在我看来,更好的方法是基于PC名称的旧默认方法。.envAPP_ENV=localAPP_ENV=production

现在 ENV 文件。如果使用基于 ENV 的环境检测,则应仅将以下内容放入 ENV 文件中:

APP_ENV=local

现在,您可以为不同的环境创建单独的 ENV 文件,例如:

.local.env

 MY_DB=testdb

.production.env

MY_DB=productiondb

现在在文件中,您可以修改:bootstrap.environment.php

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');
}

到:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');

    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
    }   
}

以基于主 env 文件加载额外的 env 文件。APP_ENV

现在,您将能够像往常一样在其他配置文件中使用它:$_ENV['MY_DB']


答案 2

对于那些刚刚升级到5.2的用户:

不能再使用静态方法。请改用以下方法:Dotenv::load()

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2
$dotenv->load();

在。bootstrap/app.php

编辑所以..在过去的一个小时里深入研究了这一点之后,我不妨在这里添加一些额外的信息:

  • Laravel 使用 .env 文件进行配置
  • 默认情况下,将加载应用程序根目录中的文件“.env”
  • 您可以通过帮助程序函数或直接通过 PHP 的本机函数访问这些 .env 文件中的值。尽管您只应这样做以填充配置文件(请参阅),因为这些文件可以缓存env()getenv()/config/*.php
  • .env 文件加载到 DetectEnvironment 类中。在调试以设置断点时,我发现这很有帮助。请注意该行:由于它使用load(),因此任何已经设置的环境值都不会被覆盖!(您必须使用它来执行此操作 - 这让我发疯,因为homestead将变量设置为php-fpm配置中的变量,您无法通过.env文件更改它)(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();overload()APP_ENVlocal/etc/php/7.0/fpm/php-fpm.conf
  • 在编写单元测试时,您通常从 TestCase 继承,它将变量设置为测试(通过 refreshApplication() - 用于覆盖默认值)APP_ENVputenv()local

推荐