如何在Laravel 4上设置不同的环境?

4
我正在尝试在Laravel 4应用程序上设置多个环境,并根据所在的环境使用不同的数据库。
对于我的本地机器,我为“local.elders.dev”设置了虚拟主机。
不幸的是,由于某种原因,以下代码无法正常工作。
$env = $app->detectEnvironment(array(
    'local' => array('http://local.elders.dev'),
));

也许我需要运行一个artisan命令或其他东西。我感觉我已经接近成功了,但还差一点!谢谢大家!

我不知道“由于某种原因它不起作用”是什么意思。有任何PHP错误可以展示吗? :) - Phil Sturgeon
不行,它只是无法识别我的本地环境... 我在“config/local”文件夹中有一个database.php文件,但Laravel仍然使用生产环境的数据库设置.. - Benjamin Gonzalez
在 $env 之前输入 var_dump($_SERVER); die();,查看您的服务器名称是什么 - 然后将其设置为该名称。 - Laurence
还可以查看此链接以获取可能的答案:https://dev59.com/qmYr5IYBdhLWcg3wNHqh - Laurence
6个回答

4

另一种方法是使用项目所在文件夹的名称。这在控制台和 web 端都可以使用。如果不同的环境托管在同一服务器上,我发现这是唯一可靠的方法。

$env = $app->detectEnvironment(array(
  'staging'     => strpos(getcwd(), '/staging')>-1, 
  'acceptance'  => strpos(getcwd(), '/acceptance')>-1, 
  'production'  => strpos(getcwd(), '/production')>-1, 
));

一个巨大的优点是,你可以通过简单地重命名或复制项目文件夹而不改变文件、数据库记录或环境变量来将暂存环境移动到生产环境。


3
我知道这个问题已经被回答了,但是对于其他寻找解决方案的人来说...
我的环境检测设置如下:
$env = $app->detectEnvironment(array(

// Development
// any machine name with the term "local" will use the local environment
'local' => array('*local*'),

// Stage
// any machine name with the term "stage" will use the stage environment
'stage' => array('*stage*')

// Production
// production is default, so we don't need to specify any detection

这很方便,因为只要我在开发时使用“local”(如“localhost”,“localhost:8000”,“my.app.local”等),“stage”也是一样。而生产环境则是默认的,所以任何没有“local”或“stage”的内容都适用于生产环境。


1
Murzeb:我正在使用WAMP在本地机器上工作。我已经在start.php中添加了上述代码。但是环境值返回生产环境。我该如何获取本地环境?我的本地URL是http://localhost/laravel-app/public/home。请给予建议。 - user2003356

3

使用 Laravel 4x 在同一台机器上处理多个环境

假设你想在同一台机器上运行相同名称的多个环境,例如一个 staging,一个 production 和一个 local 环境,那该怎么办呢?

Laravel 4x 有更好的解决方案来处理多个环境,只需要在你的 vhosts 文件或 .htaccess 中添加一行代码即可:

设置本地环境变量

在你的本地安装的 vhost 或 .htaccess 文件中,例如要添加 staging 环境,可以添加以下内容:

SetEnv LARAVEL_ENV staging

在您的生产 .htaccess 或虚拟主机中同样如此:

SetEnv LARAVEL_ENV production

然后是在start.php中通常的detectEnvironment()函数。

$env = $app->detectEnvironment(function()
{
// Default to local if LARAVEL_ENV is not set
return getenv('LARAVEL_ENV') ?: 'local';
});

我们没有忘记 本地... 这是非常酷的一部分-- 如果在vhost或.htaccess中都找不到环境变量,那么你的安装将默认为本地安装,因为它们会在其他安装中找到。

这是我的首选技术,但有一个不同点:我更喜欢将其默认为生产环境。如果我们将默认值设置为其他任何值,则在生产环境中配置失败可能会泄露内部详细信息(例如调试转储、堆栈跟踪等),而这些详细信息很可能在预生产环境中启用。 - David Weinraub
另外,请记得在命令行调用中添加 LARAVEL_ENV 设置,可以通过 bash export 或手动调用时使用类似 LARAVEL_ENV=staging php /path/to/command.php 的方式。 - David Weinraub

1

好的!我刚刚解决了问题……实际上代码是正常工作的!问题在于我使用了

$_SERVER['DB1_HOST'] //for Pagodabox.

当然这并没有在我的本地环境中设置,这几乎使应用程序崩溃了... 我通过简单的方式进行了修复:
isset($_SERVER['DB1_HOST']) ? $_SERVER['DB1_HOST'] : '';

感谢 @jeroen 和 @theshiftexchange :)

0

Laravel 4 通过在 "bootstrap/start.php" 文件中指定的机器名称来检测环境。

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

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

这意味着Laravel将为两台机器使用“local”环境设置:“Victor.local”(Mac)和“Victor-PC”(Windows)。

为了知道当前机器名称,您可以使用以下PHP代码:

<?php echo gethostname(); ?>

对于每个环境,您可以在app/config中创建一个文件夹,并替换所需的配置文件和属性。

祝好!


0
尝试将其替换为'local.elders.dev',我不确定百分之百,但它可能匹配主机名,而不是完整路径。

'*.dev'怎么样?如果连它也匹配不上,那么就是你设置数据库配置文件的方式有问题。 - Jeroen
@jeroden 你是对的。本地环境已经正确设置了... 我会回答自己的问题,并告诉大家我是如何解决它的。 - Benjamin Gonzalez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接