2014-02-12 56 views
6

Laravel 4.1 removed the feature使用该域来检测应用程序运行的环境。使用主机名读取他们现在建议的文档。但是,对于我来说,如果你在一个团队中工作,那看起来很麻烦。是否每个人都应该更改bootstrap/start.php文件并添加自己的主机名以便能够在开发环境中运行应用程序?另外,如果你想在同一台机器上有两个不同的环境呢?Laravel环境检测4.1+

如果您在Laravel 4.1+团队中工作,如何最好地检测环境?

回答

14

这里是引导/ 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设置的值。

+0

看起来很漂亮!尽管我没有“ENV”变量。我想你必须在某处设置apache配置吗?你介意在你的回答中添加说明吗? –

+0

受你的回答启发,我再次阅读文档,发现他们实际上也提示了一些非常相似的东西,但是使用$ _SERVER ['ENV']而不是getenv('ENV')。 http://laravel.com/docs/configuration#environment-configuration –

+1

我想getenv(“ENV”)指向$ _SERVER [“ENV”]。因此,使用什么工作。如果你喜欢它,请接受答案。 – carousel

1

对我来说,我只是使用'dev' => '*.local',它的工作原理。我没有100%在团队情况下进行过测试,但是我认为它会起作用(假设你在OSX上并假设使用默认的Alexs-iMac.local-比如主机名)。

至于伪造一个环境,我不确定它是否真的被支持。这将是可行的,但总的来说,整个环境的要点是dev对生产有着完全不同的需求,而两者是相互排斥的。具有切换一个物理环境的能力似乎与此目标相反。

+0

的资源,我不认为这会在所有平台上工作。我有窗户,我现在的主机名是“hhp” –

+0

我当然承认这一点。您可以尝试查看detectEnvironment数组是否可以级联。先设置prod,然后设置dev'=>'*''或其他东西。也就是说,你已经接受了使用环境变量的答案,所以我现在悄悄离开:) – alexrussell

+0

你是什么意思的级联? –

3

更新:

在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."); 
}); 

这样,所有团队成员必须从某个地方声明的环境变量。如果没有设置环境变量或只是默认生产是最好的,我还没有真正决定是否抛出异常。但是,有了以上这些,很容易改变。

+0

使用命令行时这不起作用。 Carousel的回答考虑了'$ app-> runningInConsole()',并使用'local'。这可以让你运行'php artisan'。用你的方式,我不认为你可以。 –

+0

您实际上可以用'artisan --env'开关指定环境。不过,我同意Carousel的解决方案更好。更新了答案。 –

+0

感谢提及runningInConsole() –

0

您可以使用这样的事情:

$env = $app->detectEnvironment(function(){ 
    if($_SERVER['HTTP_HOST'] == 'youdomain_local') 
    { 
     return 'local'; 
    }elseif($_SERVER['HTTP_HOST'] == 'youdomain_team') 
    { 
     return 'team'; 
    }else{ 
     return 'production'; 
    } 
}); 
+0

问题是HTTP_HOST很容易被欺骗。 –

0

我所做的是,使DIR app/config/local并使用代码

$env = $app->detectEnvironment(function(){ 
    return $_SERVER['HTTP_HOST']=="localhost"?"local":"production"; 
}); 

本地主机和网络。

+0

这很容易'黑客'。您可以通过将本地主机重定向到主机文件中的实时域来尝试。这将使得以'本地'模式运行你的实时站点成为可能,这反过来可能使你可以看到你所有的数据库配置和密码等。 –

+0

当使用CLI(Artisan)时,这会给我一个错误,因为它可以不能访问HTTP_HOST – Alias

0

我不喜欢这样的生产是默认的,所以我把它比活的服务器之外的其它会去当地的configs:

在引导/ start.php

$env = $app->detectEnvironment(function(){ 
    if (gethostname() !== 'live_server_hostname'){ 
     return 'local'; 
    } else { 
     return 'production'; 
    } 
}); 
1

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(); ?>

希望它能帮助!

0

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