【问题标题】:What's the correct way to set ENV variables in Laravel 5?在 Laravel 5 中设置 ENV 变量的正确方法是什么?
【发布时间】:2014-12-08 09:22:13
【问题描述】:

在 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 将如何知道我使用的是什么环境?

【问题讨论】:

  • 嗨 Heihachi,在 laravel-5 中,.ENV 文件位于哪个文件夹中。我找不到那个文件。你能帮帮我吗?

标签: php laravel laravel-5 laravel-environment


【解决方案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

当然local这里是本地环境,你可以改成production或者dev

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

现在是 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');
    }   
}

从主环境文件中加载基于APP_ENV 的额外环境文件。

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

【讨论】:

  • 谢谢,不用修改 environment.php 我只能使用一个 .env 文件,对吧?我也可以只设置一次APP_ENV?
  • 而且我认为这种新的“方式”比旧的更方便。因为每次从 github/bitbucket 部署时,您都必须使用所需的环境和变量创建 .env 文件。
  • @Heihachi 是的,默认情况下它只会加载 .env 文件,因此您不能拥有 2 个具有不同环境设置的 ENV。当然,如果可以的话,如果您将在配置文件中为不同的环境使用不同的环境变量名称,那么一个文件就足够了。
  • 但是如果我们根本没有 .env 文件怎么办? laravel 如何知道我们正在使用什么环境?我正在处理本地 VM 并打印 App::environment();它显示本地。它怎么知道我在本地环境中,而不是在生产环境中?
  • 在最新的 L5 (5.1) 版本中不再有 bootstrap.environment.php 文件。请参阅stackoverflow.com/a/29424899/413531 的 Anthony Pillos 回答,了解如何使其在 L5 中工作。
【解决方案2】:

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

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

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

bootstrap/app.php.

//编辑 Soo.. 在过去一个小时对此进行深入研究之后,我不妨在这里添加一些额外的信息:

  • Laravel 使用 .env 文件进行配置
  • 默认加载应用根目录下的“.env”文件
  • 您可以通过env() 辅助函数或直接通过PHP 的本机getenv() 函数访问这些.env 文件中的值。尽管您应该只填写配置文件(请参阅/config/*.php),因为those can be cached
  • .env 文件加载到DetectEnvironment 类中。我发现这在调试设置断点时很有帮助。请注意(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();这一行:因为它使用load()任何已经设置的环境值都不会被覆盖!(你必须使用overload()这样做 - 这个驱使我疯了,因为宅基地在 php-fpm 配置 /etc/php/7.0/fpm/php-fpm.conf 中将 APP_ENV 变量设置为 local 并且您不能通过 .env 文件更改它)
  • 在编写单元测试时,通常从TestCase 继承,这会将APP_ENV 变量设置为测试(通过refreshApplication() -- 使用putenv() 覆盖默认的local 值)

【讨论】:

  • 你拯救了我的一天。我的 .env 突然没有加载。我必须更改您的代码才能让它为我工作:$dotenv = new Dotenv\Dotenv(__DIR__.'/../');这将来会成为问题吗?
【解决方案3】:

我只是想为 Laravel 5.1 贡献我的解决方案,恕我直言,它稍微简单一些。在 bootstrap/app.php 中,我有(就在应用程序实例化之后):

$app->beforeBootstrapping(\Illuminate\Foundation\Bootstrap\DetectEnvironment::class, function() use ($app) {
    $suffix = (env('APP_ENV')) 
        ? '.'.env('APP_ENV') 
        : '';
    $app->loadEnvironmentFrom('.env'.$suffix);
});

不需要任何检查或错误处理。如果找不到文件,Laravel 将默认为“生产”。

就是这样。

【讨论】:

    【解决方案4】:

    默认情况下您不能拥有多个 .env 文件并且它被排除在 .gitignore 中的事实是有意的,并且是管理环境的预期方式。 .env 文件不应在版本控制中,应根据环境进行配置。 .env 设置您的环境和所有环境变量。

    所以,如果我有超过 2 个环境,我是否必须设置所有环境 现在在一个 .env 文件中?

    没有。在您安装应用程序的每个位置都会有一个.env 文件。不同之处在于该文件的内容。

    此外,因为.env 文件只是一个键值存储,任何后续声明都会覆盖之前的声明。在您的示例中,Laravel 永远不会看到您的“本地”设置。

    起初看起来很奇怪,但这个新的默认系统实际上通常更容易,并且不太容易出现“4.2 方式”曾经/已经出现的问题,因为没有逻辑错误的地方。

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

    它根本不会运行。在 .env 文件中还有一个 APP_KEY 声明,没有它 Laravel 将无法运行。如果没有 .env 文件,您将收到 500 服务器错误。

    【讨论】:

    • 我理解一个 .env 文件背后的逻辑,但在自动化 CI 系统的情况下,这一切都崩溃了。我们在 GitHub 中使用 TravisCI,它可以自行设置和自行拆除。如果不将 .env 文件提交到 GitHub,我如何设置我的 Travis 环境以查看正确的数据库等...?
    • @Brandon -- 如果您正确设置了 config.php 文件,那么您可以自行设置服务器环境,如果您愿意的话,可以将其添加到配置中对于 CI 系统本身。您可能会发现this discussion 很有用。还有this technique
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2020-01-24
    • 1970-01-01
    • 2022-11-08
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多