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

我正在移动的Laravel框架,但我遇到了数据库设置的麻烦,

具体来说,我有我的环境设置,并且他们工作正常的application.phpconfiguration文件,但是database.phpconfiguration文件似乎没有任何效果。

即使我在我的环境文件夹中有一个database.phpconfiguration文件,它永远不会被加载,我把一堆无效的字符(键盘混搭)到文件中,让PHP抛出一个错误,但它永远不会被打。

Laravel是否不支持基于环境的数据库设置? 还是我做错了?

你可以肯定地设置数据库设置(和任何其他configuration设置)的环境。

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

首先 – 你需要在你的paths.php定义$environments ,并将其设置为如下所示:

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

Laravel会自动寻找这个variables,如果设置了,就会使用关联的configuration。

通常你有一个config文件夹,设置如database.phpauth.php

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

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

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

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

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

PS我刚刚testing了这个在当前的3.2.12版本的Laravel – 它绝对有效。

奖励提示:您也可以自动为Artisan设置一个环境,所以您不必在每个命令行上手动包含环境! 去做这个:

  1. 你需要知道你的“主机名”,你正在运行Artisan。 为了find – 暂时编辑根文件夹中的artisan.php ,并添加var_dump(gethostname()); 到第2行(即高于一切)。

  2. 从命令行运行php artisan 。 你将得到一个与你的主机名string转储。 就我而言,它的“TSE-Win7”;

  3. 删除对artisan.php文件的更改

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

你应该得到这样的结果:

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

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

对于Laravel 4:

默认环境始终是production 。 但是在你的start.php文件中,你可以定义额外的环境。

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

在Linux和Mac上,您可以通过在terminal中键入hostname hostname来确定您的hostname hostname – 它将输出您的计算机的名称。 在Windows上把dd(gethostname()); 在你的routes.php文件的开始 – 运行一次网站 – 它会显示你的计算机的当前主机名。

为了在你的应用程序中获得当前的环境variables – 在这里阅读这个答案。 Laravel 4:我怎样才能获得环境价值?

对于Laravel 5:

有一个configuration文件,在你的根目录下叫.env 。 看这个laracast ,configuration完全解释。

如果你正在使用工匠(laravel的命令行),你需要添加每一个命令

 artisan bla bla bla --env=Development 

要么

 artisan bla bla bla --env=Production 

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

我个人需要4种不同的configuration:

  1. 本地主机(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/

由于我所有的4个环境都有独特的目录结构,我可以使用php的魔术常数__DIR__来获取应用程序目录,然后使用strpos()函数做一个简单的检查并返回适当的环境。 它也将照顾工匠的环境,无需手动input环境,或添加任何机器名称。

在 – 的里面

引导/ start.php

添加一个callback函数

 $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 }); 

另一种select

我们也可以将所有的值同时设置和获取到一个数组中,并运行一个foreach循环。

提示:因为我们使用strpos()函数,它检查给定值的第一次出现的位置与$ haystack的位置,并返回位置编号。 我们并不需要提供完整的path,只需在每条path上添加一个独特的价值即可完成工作。

 // 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; } 

无论我们在一台机器上还是多台机器上工作,走向不同环境的机会是相当渺茫的。

或者我想。 🙂

如何设置环境特定的configuration现在在官方的Laravel文档。 我会build议使用他们的方法,而不是接受的答案:

基于运行应用程序的环境,具有不同的configuration值通常很有帮助。例如,您可能希望在本地开发机器上使用不同的caching驱动程序,而不是生产服务器上的caching驱动程序。 使用基于环境的configuration很容易完成。

只需在config目录下创build一个与您的环境名称相匹配的文件夹,如本地。 接下来,创build您想要覆盖的configuration文件并指定该环境的选项。 例如,要覆盖本地环境的caching驱动程序,可以在app / config / local中使用以下内容创build一个cache.php文件:

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

注意:不要使用“testing”作为环境名称。 这是保留unit testing。 请注意,您不必指定基本configuration文件中的每个选项,而只需指定要覆盖的选项。 环境configuration文件将“级联”在基本文件上。

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

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

您也可以将parameter passing给环境方法,以检查环境是否与给定的值匹配:

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

Laravel 5

在这里使用Laravel文档中详细介绍的DotEnv方法。

Laravel 4

我们正在使用这个Laracasts课程中推荐的方法Jeffrey Way。

  • 为每个环境创buildconfig目录。

     /app /config /local database.php /production database.php 
  • 在生产服务器上设置一个环境variables。 Google为您的生产平台提供最佳方法。 例如,这里是Ubuntu , Dreamhost和Heroku的很棒的build议。 我们添加了一行到/etc/environment

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

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

我今天一直在努力研究如何最好地为数据库做环境设置。 最后,在尝试了几种方法之后,我完全同意@特洛维 – 哈维(Jeffrey Way)关于做这件事的build议是最好的(至less对我来说)。 有一件事我会补充到这一点,而今天让我非常担心的是( 如果我错了,纠正我 )你需要访问你的环境设置文件中的设置数组键。 我开始返回一个简单的数组:

 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>' ] ] ]; 

至less这是我最终设法得到我的设置。

在这里添加这个以防其他人正在努力解决这个问题。 一旦意识到,我明白我犯的错误是多么的明显。

2014年7月1日修改

对此的一个额外的评论是,自从4.1 Laravel附带了一个append_config()辅助函数,用于将环境configuration添加到主configuration数组中。

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

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

在Laravel 3中检测环境是:

 Request:env() 

这将返回在paths.php文件中find的环境数组中find的任何内容。

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

 App:: environment() 

我的做法!

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

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

如果你在Laravel 4 这里是一个一步一步带你通过这个过程的要点 。 信贷到@“换档”的指导我创造它的答案。