Laravel 4.1+中的环境检测

时间:2014-02-12 14:22:55

标签: php laravel

Laravel 4.1 removed the feature使用域来检测应用程序运行的环境。阅读他们现在建议使用主机名的文档。但是,对我来说,如果你在一个团队中工作,这似乎很麻烦。每个人都应该更改bootstrap/start.php文件并添加自己的主机名才能在开发环境中运行应用程序吗?另外,如果您想在同一台机器上安装两个不同的环境,该怎么办?

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

8 个答案:

答案 0 :(得分:14)

以下是 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 ...或DB_HOST或HOST ... 在本地,这些值是您用于localhost / mysql设置的值。

答案 1 :(得分:3)

<强>更新

在Laravel 5.0环境中,不再需要以相同的方式进行检测。在.env文件中,您只需拥有应用应运行的环境的变量。

Laravel的旧答案&lt; = 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.");
});

这样所有团队成员都必须在某处声明一个环境变量。如果没有设置环境变量或者默认生产是最好的,我还没有真正决定是否抛出异常。但是,如上所述,它很容易改变。

答案 2 :(得分:1)

对我来说,我只是使用'dev' => '*.local'而且它有效。我没有100%在团队情况下进行测试,但我认为它是有效的(大假设警告:)假设您使用的是OSX并获得默认的Alexs-iMac.local - 就像主机名一样。

至于假冒环境,我不确定它是否真的受到支持。它是可行的,但总的来说环境的重点是开发人员对生产有完全不同的需求,两者是相互排斥的。能够打开一个物理环境似乎与这个目标背道而驰。

答案 3 :(得分:1)

Laravel 4.1和4.2通过&#34; bootstrap / start.php&#34;中指定的机器名检测环境。文件。

例如,在我的情况下,配置变为:

$env = $app->detectEnvironment(array(
  'local' => array('Victor.local', 'Victor-PC'),
));

这意味着Laravel将使用&#39; local&#39;两台机器的环境设置:&#39; Victor.local&#39; (Mac)和&#39; Victor-PC&#39; (视窗)。

通过这种方式,您可以将多台计算机注册为本地环境。其他环境也可以注册。

要了解当前计算机名称,可以使用以下PHP代码:

<?php echo gethostname(); ?>

希望它有所帮助!

答案 4 :(得分:0)

您可以使用以下内容:

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

答案 5 :(得分:0)

我做的是,制作目录app/config/local并使用代码

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

对于localhost和在线。

答案 6 :(得分:0)

我不喜欢那个默认的制作,所以除了现场服务器以外我做的任何事情都会转到本地配置:

在bootstrap / start.php中:

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

答案 7 :(得分: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

的资源