在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将如何知道我正在使用的环境?
答案 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
这里是本地环境,您可以将其更改为production
或dev
目前我看到的最重要的问题是,您需要记住在制作时将此.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 ..在深入挖掘过去一小时后,我不妨在这里添加一些额外的信息:
env()
帮助程序函数或直接通过PHP的本机getenv()
函数访问这些.env文件中的值。虽然您只应填写配置文件(请参阅/config/*.php
),因为those can be cached。(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服务器错误。