我正在移动Laravel框架,但我遇到了数据库设置问题,
具体来说,我已经设置了环境,并且它们对application.php配置文件工作正常,但是database.php配置文件似乎没有效果。
即使我在我的环境文件夹中有一个database.php配置文件它永远不会被加载,我将一堆无效字符(键盘混搭)放入文件中以使php抛出错误,但它永远不会被命中。
Laravel不支持基于环境的数据库设置吗?或者我做错了吗?
答案 0 :(得分:64)
您绝对可以按环境设置数据库设置(以及任何其他配置设置)。
对于Laravel 3(对于Laravel 4和Laravel 5,见下文):
首先 - 您需要在$environments
中定义paths.php
并将其设置为以下内容:
$environments = array(
'development' => array('*.dev'),
'production' => array('*.com'),
);
Laravel将自动查找此变量,如果设置,将使用相关配置。
通常您有一个config
文件夹,其中包含database.php
和auth.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设置环境,因此您不必在每个命令行上手动包含环境!要做到这一点:
您需要知道您正在运行Artisan的“主机名”。要查找 - 暂时修改根文件夹中的artisan.php
,并将var_dump(gethostname());
添加到第2行(即高于所有内容)。
从命令行运行php artisan
。您将获得包含主机名的字符串转储。就我而言,它的“TSE-Win7”;
删除对artisan.php
文件
将您的主机名(即“TSE-Win7”)添加到环境中。
你应该得到这样的东西:
$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种不同的配置:
由于我的所有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)
使用DotEnv中详述的the Laravel docs here方法。
我们正在使用此Laracasts lesson中推荐的Jeffrey Way方法。
创建config
目录for each environment。
/app
/config
/local
database.php
/production
database.php
在生产服务器上设置环境变量。 Google是您生产平台上的最佳方法。例如,以下是针对Ubuntu,Dreamhost和Heroku的精彩建议。我们在/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”的回答,指导我创建它。