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.php
和auth.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设置一个环境,所以您不必在每个命令行上手动包含环境! 去做这个:
-
你需要知道你的“主机名”,你正在运行Artisan。 为了find – 暂时编辑根文件夹中的
artisan.php
,并添加var_dump(gethostname());
到第2行(即高于一切)。 -
从命令行运行
php artisan
。 你将得到一个与你的主机名string转储。 就我而言,它的“TSE-Win7”; -
删除对
artisan.php
文件的更改 -
将您的主机名称(即“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:
- 本地主机(Mac OSX) – /Library/WebServer/Documents/www/my-domain.com/development/
- dev.my-domain.com(VPS) – /var/www/my-domain.com/development/
- test.my-domain.com(VPS) – /var/www/my-domain.com/test/
- 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。
-
为每个环境创build
config
目录。/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 这里是一个一步一步带你通过这个过程的要点 。 信贷到@“换档”的指导我创造它的答案。