Php 什么';在Laravel 5中设置环境变量的正确方法是什么?

Php 什么';在Laravel 5中设置环境变量的正确方法是什么?,php,laravel,laravel-5,laravel-environment,Php,Laravel,Laravel 5,Laravel Environment,在laravel 4中,我们有: $env = $app->detectEnvironment(array( 'local' => array('homestead') )); 默认情况下 但在laravel 5中更改为: $env = $app->detectEnvironment(function() { return getenv('APP_ENV') ?: 'production'; }); $env = $app->detectEnviron

在laravel 4中,我们有:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));
默认情况下

但在laravel 5中更改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});
$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如何知道我使用的是什么环境?

您可以完全按照laravel 4中的操作进行:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));
*.env
文件仅用于将不应放入VCS的敏感数据放入VCS。同样的情况也发生在拉威尔4号

但在过去几天中,默认检测环境似乎更改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});
$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});
因此,您可以使用PC名称或ENV文件中的设置变量

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

APP_ENV=local
当然
local
这里是本地环境,您可以将其更改为
production
dev

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

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

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

.local.env

 MY_DB=testdb
MY_DB=productiondb
.production.env

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

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

根据主环境文件中的
APP_env
加载额外的环境文件


现在,您可以像往常一样在其他配置文件中使用它:
$\u ENV['MY\u DB']

对于刚升级到5.2的用户:

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

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

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

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

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

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


仅此而已。

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

那么,如果我有两个以上的环境,我必须设置所有环境吗 现在在单个.env文件中

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

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

一开始似乎有些奇怪,但这种新的默认系统实际上更容易出现“4.2方式”所遇到的问题,因为没有逻辑错误的地方

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


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

谢谢,在不修改environment.php的情况下,我只能使用一个.env文件,对吗?我还可以只设置APP_env一次?我认为这是一种新的“方式”比旧的更方便。因为每次从github/bitbucket部署时,您都必须创建带有所需环境和变量的.env文件。@Heihachi是的,默认情况下它只加载
.env
文件,所以您不能有两个带有不同环境设置的env。当然,如果可以的话,一个文件就足够了我在你的配置文件中为不同的环境使用不同的环境变量名称。但是如果我们根本没有.env文件怎么办?laravel怎么知道我们在使用什么环境?我正在处理本地VM并打印App::environment();它显示本地。它怎么知道我在本地环境,而不是生产环境?在最新的L5(5.1)中发行版中不再有
bootstrap.environment.php
文件。请参阅Anthony Pillos在关于如何使其在L5.Hi中工作的回答