Laravel 4.1移除了使用域名检测应用程序运行环境的功能。阅读文档,现在建议使用主机名。然而,如果您正在团队中工作,这似乎很麻烦。每个人都需要更改bootstrap/start.php
文件并添加自己的主机名才能在开发环境中运行应用程序吗?另外,如果您想在同一台机器上拥有两个不同的环境怎么办?
在Laravel 4.1+中,如何最好地检测团队中的环境?
Laravel 4.1移除了使用域名检测应用程序运行环境的功能。阅读文档,现在建议使用主机名。然而,如果您正在团队中工作,这似乎很麻烦。每个人都需要更改bootstrap/start.php
文件并添加自己的主机名才能在开发环境中运行应用程序吗?另外,如果您想在同一台机器上拥有两个不同的环境怎么办?
在Laravel 4.1+中,如何最好地检测团队中的环境?
这里是来自 bootstrap/start.php 文件的设置:
$env = $app->detectEnvironment(function() use($app) {
return getenv('ENV') ?: ($app->runningInConsole() ? 'local' : 'production');
});
与其使用默认的数组,我的方法返回一个带有三元运算符的闭包,这样我可以更加灵活地选择所需的环境。你也可以使用 switch 语句。Laravel 将读取返回值并进行配置。
使用 getenv 原生函数,我只需要监听给定的环境即可。如果我的应用在服务器上,则它将选择服务器配置。如果在本地,则会选择本地(或开发)配置。
不要忘记在 app/config 中为你的环境创建自定义目录。
还有测试环境,每次测试应用程序时都会自动选择。
Laravel 使得处理环境非常有趣。
更新:
在处理环境时,我们主要关注数据库凭据。
对于生产环境,我使用 Fortrabbit,因此在服务器上配置新应用程序时,fortrabbit 为我生成这些值。我只需要声明它们。例如 DB 或仅 database、DB_HOST 或 HOST 等等 …
在本地,这些值是你用于 localhost/mysql 设置的那些值。
更新:
在 Laravel 5.0 中,不再需要以同样的方式进行环境检测。你可以在 .env
文件中简单地定义应用程序应在哪个环境下运行。
Laravel <= 4.2 的旧回答
我最终所做的非常接近 carousel 建议的内容。不管怎样,我想分享一下。以下是我们的 bootstrap/start.php
文件相关部分:
$env = $app->detectEnvironment(function ()
{
if($app->runningInConsole())
return "development";
$validEnvironments = array("development", "staging", "production");
if (in_array(getenv('APP_ENV'), $validEnvironments)) {
return getenv('APP_ENV');
}
throw new Exception("Environment variable not set or is not valid. See developer manual for further information.");
});
这样所有团队成员都需要在某个地方声明一个环境变量。我还没有确定如果环境变量未设置应该抛出异常还是默认为生产环境更好。但是,有了上面的方法,更改起来很容易。
$app->runningInConsole()
并使用了local
。这允许您运行php artisan
。使用您的方法我认为无法做到。 - Dustin Griffithartisan --env
开关来指定环境。不过,我同意 Carousel 的解决方案更好。已更新答案。 - Simon Bengtsson$env = $app->detectEnvironment(array(
'local' => array('Victor.local', 'Victor-PC'),
));
<?php echo gethostname(); ?>
希望能帮到您!'dev' => '*.local'
就可以了。我还没有在团队环境中进行100%的测试,但我认为它应该可以工作(大胆的假设:)假设你在OSX上,并且获得默认的 Alexs-iMac.local
类似的主机名。'dev' => '*'
或其他什么的。话虽如此,既然你已经接受了使用环境变量的答案,那我就悄悄离开吧 :) - alexrussell['prod' => 'servername.com', 'dev' => '*']
,那么它是否按预期工作,并在生产环境中正确地看到 prod,其他所有情况都是 dev,还是反过来呢?无论如何,值得深入研究。 - alexrussell$env = $app->detectEnvironment(function(){
if (gethostname() !== 'live_server_hostname'){
return 'local';
} else {
return 'production';
}
});
app/config/local
并使用代码。$env = $app->detectEnvironment(function(){
return $_SERVER['HTTP_HOST']=="localhost"?"local":"production";
});
适用于本地主机和在线环境。
$env = $app->detectEnvironment(function(){
if($_SERVER['HTTP_HOST'] == 'youdomain_local')
{
return 'local';
}elseif($_SERVER['HTTP_HOST'] == 'youdomain_team')
{
return 'team';
}else{
return 'production';
}
});
bootstrap/start.php
中定义这个:$env = $app->detectEnvironment(function() use($app) {
$enviromentsHosts = [
'localhost',
'local',
];
if ($app->runningInConsole() || in_array($app['request']->getHost(), $enviromentsHosts)) {
return 'local';
} else {
return 'production';
}
});
我认为最好只使用 Laravel 4
的资源。