29

在 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

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

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

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

4

4 回答 4

30

你可以像在 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=localAPP_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 文件加载额外的 env 文件。

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

于 2014-10-13T18:22:51.413 回答
12

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

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

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

bootstrap/app.php.

//edit Soo.. 在过去一小时深入研究之后,我不妨在这里添加一些额外的信息:

  • Laravel 使用 .env 文件进行配置
  • 默认加载应用程序根目录下的“.env”文件
  • env()您可以通过辅助函数或直接通过 PHP 的本机函数访问这些 .env 文件中的值getenv()。虽然您应该只填写配置文件(请参阅 参考资料/config/*.php),因为它们可以被缓存
  • .env 文件加载到DetectEnvironment类中。我发现这在调试设置断点时很有帮助。请注意以下行(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();:由于它使用任何已设置的环境值,因此不会被覆盖!(你必须这样做——这让我发疯了,因为宅基地在 php-fpm 配置中设置了变量,你不能通过 .env 文件更改它)load() overload()APP_ENVlocal/etc/php/7.0/fpm/php-fpm.conf
  • 在编写单元测试时,您通常继承自TestCase,它将APP_ENV变量设置为测试(通过refreshApplication()-- 使用putenv()覆盖默认local值)
于 2016-01-17T12:14:26.550 回答
1

我只是想为 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 将默认为“生产”。

就这些。

于 2016-07-17T13:05:45.380 回答
0

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

那么,如果我有两个以上的环境,我现在是否必须将它们全部设置在一个 .env 文件中?

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

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

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

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

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

于 2017-01-12T21:19:57.560 回答