Laravel 4.1 removed the feature使用该域来检测应用程序运行的环境。使用主机名读取他们现在建议的文档。但是,对于我来说,如果你在一个团队中工作,那看起来很麻烦。是否每个人都应该更改bootstrap/start.php
文件并添加自己的主机名以便能够在开发环境中运行应用程序?另外,如果你想在同一台机器上有两个不同的环境呢?Laravel环境检测4.1+
如果您在Laravel 4.1+团队中工作,如何最好地检测环境?
Laravel 4.1 removed the feature使用该域来检测应用程序运行的环境。使用主机名读取他们现在建议的文档。但是,对于我来说,如果你在一个团队中工作,那看起来很麻烦。是否每个人都应该更改bootstrap/start.php
文件并添加自己的主机名以便能够在开发环境中运行应用程序?另外,如果你想在同一台机器上有两个不同的环境呢?Laravel环境检测4.1+
如果您在Laravel 4.1+团队中工作,如何最好地检测环境?
这里是引导/ start.php文件我的设置:
$env = $app->detectEnvironment(function() use($app) {
return getenv('ENV') ?: ($app->runningInConsole() ? 'local' : 'production');
});
而是默认数组,这个方法在我的情况与三元返回关闭。这样我在选择所需的环境方面就有了更大的灵活性你也可以使用switch语句。 Laravel将读取返回值并进行自我配置。 与getenv原生函数,我只是听一个给定的环境。如果我的应用程序在服务器上,那么它将“挑选”服务器配置。如果是本地的,那么它将选择本地(或开发) 并且不要忘记为您的环境创建自定义目录app/config 还有测试环境,它会自动选择,每次你是单元测试应用程序。
Laravel使环境工作真的很有趣。
UPDATE:
随着我们大多cencerned有关数据库凭据环境。
对于生产我使用Fortrabbit,所以当在服务器上配置新的应用程序时,fortrabbit会为我生成这些值。我只需要申报。例如数据库或数据库的DB ...或者DB_HOST或HOST ... 本地,这些值是您用于localhost/mysql设置的值。
对我来说,我只是使用'dev' => '*.local'
,它的工作原理。我没有100%在团队情况下进行过测试,但是我认为它会起作用(假设你在OSX上并假设使用默认的Alexs-iMac.local
-比如主机名)。
至于伪造一个环境,我不确定它是否真的被支持。这将是可行的,但总的来说,整个环境的要点是dev对生产有着完全不同的需求,而两者是相互排斥的。具有切换一个物理环境的能力似乎与此目标相反。
的资源,我不认为这会在所有平台上工作。我有窗户,我现在的主机名是“hhp” –
我当然承认这一点。您可以尝试查看detectEnvironment数组是否可以级联。先设置prod,然后设置dev'=>'*''或其他东西。也就是说,你已经接受了使用环境变量的答案,所以我现在悄悄离开:) – alexrussell
你是什么意思的级联? –
更新:
在Laravel 5.0环境检测不再需要以同样的方式。在.env
文件,你可以简单地对这些环境的应用程序应该运行在一个变量。
老答案Laravel < = 4.2
我落得这样做是非常密切的建议是什么转盘。无论如何,以为我会分享它。这是我们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.");
});
这样,所有团队成员必须从某个地方声明的环境变量。如果没有设置环境变量或只是默认生产是最好的,我还没有真正决定是否抛出异常。但是,有了以上这些,很容易改变。
使用命令行时这不起作用。 Carousel的回答考虑了'$ app-> runningInConsole()',并使用'local'。这可以让你运行'php artisan'。用你的方式,我不认为你可以。 –
您实际上可以用'artisan --env'开关指定环境。不过,我同意Carousel的解决方案更好。更新了答案。 –
感谢提及runningInConsole() –
您可以使用这样的事情:
$env = $app->detectEnvironment(function(){
if($_SERVER['HTTP_HOST'] == 'youdomain_local')
{
return 'local';
}elseif($_SERVER['HTTP_HOST'] == 'youdomain_team')
{
return 'team';
}else{
return 'production';
}
});
问题是HTTP_HOST很容易被欺骗。 –
我所做的是,使DIR app/config/local
并使用代码
$env = $app->detectEnvironment(function(){
return $_SERVER['HTTP_HOST']=="localhost"?"local":"production";
});
本地主机和网络。
这很容易'黑客'。您可以通过将本地主机重定向到主机文件中的实时域来尝试。这将使得以'本地'模式运行你的实时站点成为可能,这反过来可能使你可以看到你所有的数据库配置和密码等。 –
当使用CLI(Artisan)时,这会给我一个错误,因为它可以不能访问HTTP_HOST – Alias
我不喜欢这样的生产是默认的,所以我把它比活的服务器之外的其它会去当地的configs:
在引导/ start.php:
$env = $app->detectEnvironment(function(){
if (gethostname() !== 'live_server_hostname'){
return 'local';
} else {
return 'production';
}
});
Laravel 4.1 4.2通过“bootstrap/start.php”文件中指定的机器名称检测环境。
例如,在我的情况下,配置变为:
$env = $app->detectEnvironment(array(
'local' => array('Victor.local', 'Victor-PC'),
));
这意味着Laravel将使用“本地”环境设置两台机器:“Victor.local”(在Mac)和“Victor- PC'(Windows)。
这样你可以regsiter几台机器作为本地环境工作。其他环境也可以注册。
为了了解当前机器名,可以使用下面的PHP代码:
<?php echo gethostname(); ?>
希望它能帮助!
在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
看起来很漂亮!尽管我没有“ENV”变量。我想你必须在某处设置apache配置吗?你介意在你的回答中添加说明吗? –
受你的回答启发,我再次阅读文档,发现他们实际上也提示了一些非常相似的东西,但是使用$ _SERVER ['ENV']而不是getenv('ENV')。 http://laravel.com/docs/configuration#environment-configuration –
我想getenv(“ENV”)指向$ _SERVER [“ENV”]。因此,使用什么工作。如果你喜欢它,请接受答案。 – carousel