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

时间:2014-10-13 18:14:39

标签: 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';
});

此外,他们已排除.gitignore中的 .env。* 行,现在它已经:

.env

并添加了文件.env.example:

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

所以,如果我有两个以上的环境,我现在必须在一个.env文件中设置所有这些吗? E.g:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

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

4 个答案:

答案 0 :(得分:30)

你可以和Laravel 4完全一样:

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

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

但似乎在最后几天默认的detectEnvironment已更改为:

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

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

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

APP_ENV=local

当然local这里是本地环境,您可以将其更改为productiondev

目前我看到的最重要的问题是,您需要记住在制作时将此.env文件内容从APP_ENV=local更改为APP_ENV=production,所以在我看来更好method是基于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');
    }   
}

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

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

答案 1 :(得分:12)

对于那些刚刚升级到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() ,因此不会覆盖任何已设置的环境值!(您必须使用{{1}这样做 - 这驱使我坚持因为宅基地在php-fpm config overload()中将APP_ENV变量设置为local,你不能通过它来改变它。 env文件)
  • 在编写单元测试时,通常会继承TestCase,将/etc/php/7.0/fpm/php-fpm.conf变量设置为测试(通过refreshApplication() - 使用APP_ENV覆盖默认{{} 1}}}))

答案 2 :(得分: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将默认为“生产”。

就是这样。

答案 3 :(得分:0)

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

  

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

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

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

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

  

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

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