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

Posted

技术标签:

【中文标题】如何在 Laravel 4 上设置不同的环境?【英文标题】:How to set up different environments on Laravel 4? 【发布时间】:2013-01-09 22:24:24 【问题描述】:

我正在尝试在 Laravel 4 应用程序上设置多个环境,并且根据我们所处的环境自然会设置不同的数据库。

对于我的本地机器,我为“local.elders.dev”设置了一个虚拟主机

很遗憾,由于某种原因,以下代码无法正常工作。

$env = $app->detectEnvironment(array(
    'local' => array('http://local.elders.dev'),
));

也许我需要运行一个工匠命令或其他东西。我觉得我很接近了,但还不是很接近!

谢谢大家!

【问题讨论】:

我不知道“由于某种原因它不起作用”是什么意思。有任何类型的 php 错误要炫耀吗? :) 不,它只是无法识别我的本地环境...我在 'config/local' 文件夹中有一个 database.php 文件,但 Laravel 仍在使用 db 的生产设置..跨度> 类型 var_dump($_SERVER);死();在 $env 之前,看看你的服务器名称叫什么 - 然后将它设置为那个 并查看此链接以获得可能的答案:***.com/q/13860283/1317935 【参考方案1】:

尝试用'local.elders.dev' 替换它,我不确定100%,但它可能匹配主机名,而不是完整路径。

【讨论】:

'*.dev' 怎么样?如果这不匹配,则说明您设置数据库配置文件的方式有问题。 @jeroden 你是对的。本地环境设置正确......我将用我如何解决它来回答我自己的问题【参考方案2】:

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

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

当然,这不是在我的本地环境中设置的,这几乎破坏了应用程序...

我通过简单地修复:

isset($_SERVER['DB1_HOST']) ? $_SERVER['DB1_HOST'] : '';

感谢@jeroen 和@theshiftexchange :)

【讨论】:

【参考方案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

));

这很方便,因为它适用于任何项目,只要我使用“本地”进行开发(如“localhost”、“localhost:8000”、“my.app.local”等)。 “舞台”也是如此。并且生产是默认的,所以没有“本地”或“阶段”的任何东西都适用于生产。

【讨论】:

Murzeb:我正在使用 WAMP 在本地计算机上工作。我在 start.php 中添加了上述编码。但是环境值返回生产。如何获得本地环境?我的本地 URL 是localhost/laravel-app/public/home。请指教..【参考方案4】:

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

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

一个很大的优势是您可以通过简单地重命名或复制项目文件夹而不更改文件、数据库记录或环境变量来将登台迁移到生产环境。

【讨论】:

【参考方案5】:

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

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

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

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

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

<?php echo gethostname(); ?>

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

问候!

【讨论】:

【参考方案6】:

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

如果您想在同一台机器上运行多个具有相同名称的环境 - 例如,stagingproduction AND 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';
);

我们没有忘记 local... 这是很酷的部分 - 如果在 vhost 或 .htaccess 中都找不到环境变量,您的安装将默认为本地,因为它们会被发现在其他安装中。

【讨论】:

这是我的首选技术,但有一个区别:我更喜欢默认为生产。如果我们默认使用其他任何内容,那么在生产环境中配置失败可能会泄漏内部信息,例如调试转储、堆栈跟踪等,这些信息可能在预生产环境中启用。 另外,请记住将 LARAVEL_ENV 设置添加到命令行调用中,可以通过 bash export 或使用类似 LARAVEL_ENV=staging php /path/to/command.php 的方式手动调用

以上是关于如何在 Laravel 4 上设置不同的环境?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Laravel 4 环境变量工作?

如何使用laravel 4安静地返回图像?

如何使用 laravel 4 从容地返回图像?

如何使用命令行清除 laravel 中的缓存?

如何使用 laravel artisan 设置 env 以拥有两个不同的数据库连接(本地/远程)?

beantalk 上的 laravel 4,php artisan 如何弄清楚环境