Laravel中的环境驱动数据库设置?

时间:2012-12-13 12:53:49

标签: php database environment laravel

我正在移动Laravel框架,但我遇到了数据库设置问题,

具体来说,我已经设置了环境,并且它们对application.php配置文件工作正常,但是database.php配置文件似乎没有效果。

即使我在我的环境文件夹中有一个database.php配置文件它永远不会被加载,我将一堆无效字符(键盘混搭)放入文件中以使php抛出错误,但它永远不会被命中。

Laravel不支持基于环境的数据库设置吗?或者我做错了吗?

10 个答案:

答案 0 :(得分:64)

您绝对可以按环境设置数据库设置(以及任何其他配置设置)。

对于Laravel 3(对于Laravel 4和Laravel 5,见下文):

首先 - 您需要在$environments中定义paths.php并将其设置为以下内容:

$environments = array(
  'development' => array('*.dev'),
  'production' => array('*.com'),
);

Laravel将自动查找此变量,如果设置,将使用相关配置。

通常您有一个config文件夹,其中包含database.phpauth.php

等设置

现在只为您计划使用的每个Laravel_Env创建一个新文件夹(例如开发)。你最终会得到像这样的文件夹结构;

/application
  /config
    /development
      database.php
    /production
      database.php
    application.php
    config.php
    database.php
    ...
    user_agents.php

您会注意到我在每个子文件夹中只包含database.php。 Laravel将始终首先加载默认配置设置,然后使用环境设置中的任何自定义配置覆盖它们。

最后,在你的开发/数据库文件中,你会有这样的东西;

<?php
 return array(
'default' => 'mysql'
 );

P.S。我刚刚在Laravel的当前3.2.12版本上进行了测试 - 它确实有效。

红利提示:您还可以自动为Artisan设置环境,因此您不必在每个命令行上手动包含环境!要做到这一点:

  1. 您需要知道您正在运行Artisan的“主机名”。要查找 - 暂时修改根文件夹中的artisan.php,并将var_dump(gethostname());添加到第2行(即高于所有内容)。

  2. 从命令行运行php artisan。您将获得包含主机名的字符串转储。就我而言,它的“TSE-Win7”;

  3. 删除对artisan.php文件

  4. 的更改
  5. 将您的主机名(即“TSE-Win7”)添加到环境中。

  6. 你应该得到这样的东西:

    $environments = array(
      'development' => array('*.dev', 'TSE-Win7'),
      'production' => array('*.com'),
    );
    

    Artisan现在将使用您的开发环境运行。如果部署到实时服务器 - 重新运行这些步骤以获取服务器的hostname(),并且可以仅为服务器配置特定的工匠配置!

    对于Laravel 4:

    默认环境始终为production。但是在 start.php 文件中,您可以定义其他环境。

     $env = $app->detectEnvironment(array(
       'local' => array('your-machine-name'),
    ));
    

    在Linux和Mac上,您可以在终端中按类型hostname确定hostname - 它将输出您的计算机名称。在Windows上将dd(gethostname());放在routes.php文件的开头 - 并运行一次网站 - 它会显示您计算机的当前主机名。

    要将当前环境作为应用程序中的变量 - 请在此处阅读此SO答案。 Laravel 4: how can I get the environment value?

    对于Laravel 5:

    根目录中有一个名为.env的配置文件。 Watch this laracast,配置完全解释。

答案 1 :(得分:8)

如果您使用工匠(laravel的命令行),则需要添加每个命令

artisan bla bla bla --env=Development 

artisan bla bla bla --env=Production

答案 2 :(得分:4)

以下是我如何设置我的需求。

我个人需要4种不同的配置:

  1. localhost(Mac OSX) - / Library / WebServer/Documents/www/my-domain.com/development/
  2. dev.my-domain.com(VPS) - /var/www/my-domain.com/development /
  3. test.my-domain.com(VPS) - /var/www/my-domain.com/test/
  4. my-domain.com(VPS) - /var/www/my-domain.com/web /
  5. 由于我的所有4个环境都有独特的目录结构,我可以使用php的魔术常量 __ DIR __ 来获取app目录,然后使用 strpos()函数来执行此操作一个简单的检查并返回适当的环境。它也会照顾Artisan环境,无需手动输入环境或添加任何机器名称。

      

    自举/ start.php

    添加回调函数

    $env = $app->detectEnvironment(function(){
    
      $haystack = __DIR__; // Catch the directory path
    
      // Set the booleans (remove the first '/', else strpos() will return 0)
      $isLocal       = strpos($haystack, 'Library/WebServer/Documents/www/my-domain.com/development/');
      $isDevelopment = strpos($haystack, 'var/www/my-domain.com/development/');
      $isTest        = strpos($haystack, 'var/www/my-domain.com/test/');
      $isProduction  = strpos($haystack, 'var/www/my-domain.com/web/');
    
      // Set the environments
      if ($isLocal)       $environment = "local";
      if ($isDevelopment) $environment = "development";
      if ($isTest)        $environment = "test";
      if ($isProduction)  $environment = "production";
    
      // Return the appropriate environment
      return $environment
    });
    

    另一种选择

    我们也可以一次设置并抓取所有值到一个数组中,并运行一个foreach循环。

    提示:因为我们使用 strpos()函数,该函数会检查第一次出现的给定值与 $ haystack 的位置,并返回位置编号。我们实际上不必提供整个路径,我们可以简单地从每个路径添加一个独特的值来完成工作。

    // Check the boolean, if true set to given value, else set NULL
    $environments[] = strpos($haystack, "Library") ? 'local'      : NULL;
    $environments[] = strpos($haystack, "develop") ? 'development': NULL;
    $environments[] = strpos($haystack, "test")    ? 'test'       : NULL;
    $environments[] = strpos($haystack, "web")     ? 'production' : NULL;
    
    // Loop through each, if not null then we have our environment
    foreach ($environments as $environment) {
         if(!is_null($environment))
         return $environment;
    }
    

    无论我们是在一台机器还是多台机器上工作,在不同环境中使用相同路径的可能性非常小。

    或者我认为。 :)

答案 3 :(得分:2)

How to setup environment specific configuration 现在正在Laravel官方文档中。我建议使用他们的方法而不是接受的答案:

  

基于不同的配置值通常很有帮助   应用程序运行的环境。例如,您可以   希望在本地开发计算机上使用不同的缓存驱动程序   而不是在生产服务器上。使用它很容易实现   基于环境的配置。

     

只需在config目录中创建一个与您的文件夹匹配的文件夹   环境名称,例如local。接下来,创建配置文件   您希望覆盖并指定该环境的选项。对于   例如,要覆盖本地环境的缓存驱动程序   将使用以下内容在app / config / local中创建cache.php文件   含量:

<?php    
return array(    
    'driver' => 'file',    
);
  

注意:请勿使用“testing”作为环境名称。这是保留的   用于单元测试。请注意,您不必指定每个选项   它位于基本配置文件中,但只包含您希望的选项   覆盖。环境配置文件将“级联”   基础文件。

     

接下来,我们需要指导框架如何确定哪个   它正在运行的环境。默认环境始终是   生产。但是,您可以在其中设置其他环境   安装根目录下的bootstrap / start.php文件。在这   文件,你会发现$ app-&gt; detectEnvironment调用。数组通过了   此方法用于确定当前环境。你可以   根据需要将其他环境和机器名称添加到阵列中。

<?php

$env = $app->detectEnvironment(array(    
    'local' => array('your-machine-name'),    
));
  

在此示例中,“local”是环境的名称   'your-machine-name'是服务器的主机名。在Linux和Mac上,   您可以使用hostname terminal命令确定主机名。

     

如果您需要更灵活的环境检测,您可以通过   关闭detectEnvironment方法,允许您实现   你希望环境检测:

$env = $app->detectEnvironment(function()
{ 
    $domain = explode('.', $_SERVER['HTTP_HOST']);
    switch($domain[0])
    {
        case 'localhost':
        case 'localhost:8080':                
        case 'dev':
            return 'development';
            break;
        case 'mysite':
        default:
            return 'production';
            break;
    }
});
  

您可以通过环境访问当前的应用程序环境   方法:

     

访问当前的应用程序环境

$environment = App::environment();
  

您也可以将参数传递给环境方法以检查是否存在   环境匹配给定值:

if (App::environment('local'))
{
    // The environment is local
}

if (App::environment('local', 'staging'))
{
    // The environment is either local OR staging...
}

答案 4 :(得分:2)

Laravel 5

使用DotEnv中详述的the Laravel docs here方法。

Laravel 4

我们正在使用此Laracasts lesson中推荐的Jeffrey Way方法。

  • 创建config目录for each environment

    /app
        /config
            /local
                database.php
            /production
                database.php
    
  • 在生产服务器上设置环境变量。 Google是您生产平台上的最佳方法。例如,以下是针对UbuntuDreamhostHeroku的精彩建议。我们在/etc/environment添加了一行:

    ENV=production
    
  • 将此闭包添加到/bootstrap/start.php。使用此设置,任何缺少ENV环境变量的服务器都将默认为local环境配置。

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    

答案 5 :(得分:1)

我今天一直在努力解决这个问题,努力弄清楚如何最好地为数据库进行环境设置。最后,在尝试了几种方法后,我完全赞同@ troy-harvey,Jeffrey Way建议这样做是最好的(至少对我来说)。我将添加一件事,今天让我如此兴奋的是(并纠正我,如果我错了)你需要访问你想要覆盖的设置您的环境设置文件由相应的数组键。我开始返回一个简单的数组:

return [
    'database' => '<db_name>',
    'username' => '<db_user>',
    'password' => '<db_pass>',
]; 

app/config/staging/database.php内。这没有任何影响,经过多次头部刮擦意识到您需要访问app/config/database.php中显示的数组,如下所示:

<?php

return [
'connections' => [
    'mysql' => [
        'database' => '<db_name>',
        'username' => '<db_user>',
        'password' => '<db_pass>'
    ]
  ]
];

至少这是我最终设法获取我的设置的方式。

在此添加此内容以防其他人正在努力解决这个问题。一旦实现,我就明白了我犯的错误是多么明显。

2014年7月1日编辑

对此的另一个评论是,因为4.1 Laravel附带了一个append_config()辅助函数,用于将环境配置附加到主配置数组。

对于上面给出的例子,这看起来像这样:

<?php

return append_config([
     'connections' => [
        'mysql' => [
             'database' => '<db_name>',
             'username' => '<db_user>',
             'password' => '<db_pass>'
        ]
      ]
   ]);

答案 6 :(得分:0)

在Laravel 3中检测环境:

Request:env()

哪个会返回在paths.php文件中找到的环境数组中识别的内容。

正如之前在Laravel 4中提到的,现在是:

App:: environment()

答案 7 :(得分:0)

我这样做的方式!

$env = $app->detectEnvironment( function() {
    if ( file_exists('../.env.local.php') ) {
        return 'local';
    }
    if ( file_exists('../.env.beta.php') ) {
        return 'beta';
    }
    return 'production';
} );

答案 8 :(得分:0)

如果您尝试在Windows环境中使用Laravel,请查看Laravel项目顶级文件夹中文件.env中的设置 - 这些将覆盖您在config / database.php中的任何数据库设置

答案 9 :(得分:0)

如果您使用的是Laravel 4 here is a gist,它将逐步引导您完成整个过程。归功于@“The Shift Exchange”的回答,指导我创建它。