Laravel 5配置 - 环境和覆盖

12

我安装了全新的Laravel 5副本。

我的detectEnvironment函数定义如下:

$app->detectEnvironment(function()
{
    return 'local';
    return getenv('APP_ENV') ?: 'production';
});

我在 config\local 目录中创建了 database.php 文件:

<?php

return [
    'nothing' => 'new',
];

我运行了php artisan clear-compiled命令。

我的WelcomeController控制器中的index方法定义如下:

public function index(Application $app)
{
    echo $app->environment();
    var_dump($app['config']['database']);
    //echo $app['config']['database'];
    return view('welcome');
}

应用程序是通过这种方式导入的:use Illuminate\Foundation\Application;

我得到的结果是:

local array(1) { ["nothing"]=> string(3) "new" } 

虽然我希望Laravel会用生产环境的配置文件覆盖默认的config\database.php文件。

奇怪的是,即使我注释掉return 'local';这一行并再次运行php artisan clear-compiled,它仍然显示:

production array(1) { ["nothing"]=> string(3) "new" } 

看起来它总是加载本地文件夹中的 database.php 文件并覆盖主要的 database.php 文件。当我将这个文件名更改为例如 aaa.php 时,它又正常工作了。

这是一个 bug 还是环境配置不应该存储在 config 目录中?但如果不是,它们应该存储在哪里?我不知道这是一个 bug 还是一个特性,所以如果有人更了解,请给我一个提示。

4个回答

13
尽管Laravel dev(5.0)文档中有关于配置会级联的信息,但事实并非如此。我在大约两周前进行了测试,目前似乎唯一拥有不同环境值的方法是使用ENV文件,在其中为当前环境设置自定义值。将设置放在目录中不起作用,尽管它以前可以工作,但可能已经改变或者已经在过去的两个星期里改变了。

7

有一个软件包,将级联配置系统带回 Laravel 5。

免责声明:我是作者。


5
谢谢。在我看来,L5中的环境处理是一步倒退。指定“环境”的目的是为了能够加载该环境下的正确设置,而不必通过一堆条件语句来确定我正在运行的环境。在这方面,L4要好得多 - 我是“local” - 好的,那就加载“local”配置。这是我需要的唯一条件语句。 - ekeyser
我完全同意ekeyser的观点。这确实是一步倒退。查询构建器中删除缓存也是如此。还有很多其他的东西,例如Flash消息。 - Todor Todorov
我从 v3 开始就一直使用 Laravel。这个 v5 的配置设置简直疯狂。它以少数人的使用案例为代价解决了一些问题,但对其他人来说是有损的。 - swt83
@An Phan 我不太喜欢使用config.envName的方式,因为我的应用部署在3个服务器上 :) 为什么不在config文件夹内创建envName文件夹呢? - junkystu
@junkystu 因为这会触发 Laravel 的致命错误。 - An Phan
@AnPhan 我明白,那很糟糕。我完全支持使用 .env 文件来避免跟踪密码或其他敏感配置数据,但我只需要添加一些各种配置项的数组。我想将它们添加到数据库可能是最好的选择 :P - junkystu

3

对我来说,这看起来像是Laravel 5开发分支中的缺陷。我通过添加手动环境检测和配置来解决了这个问题。以下代码可以实现此功能。

'default' => $app->environment()=='testing'?'sqlite':'mysql',

3
小提示:使用 $app->environment('testing') 和 $app->environment()=='testing' 类似。 - Javi Stolz

0

Laravel 5环境配置很容易。

  1. 打开您的根应用程序文件夹并找到“.env.example”文件,
  2. 复制并将其重命名为“.env”,
  3. 请将“.env”文件适配到您的环境中,
  4. 如果您使用GIT,请确保不要将此文件推送到您的GIT存储库中。 有关“完整说明”,我在这里撰写了此配置。

编辑;

我从开发人员的GitHub存储库readme.md文件中引用:

phpdotenv是为开发环境而制作的,通常不应在生产环境中使用。在生产中,应设置实际的环境变量,以便不需要在每个请求上加载.env文件。这可以通过使用像Vagrant、chef或Puppet等工具的自动化部署流程来实现,也可以通过像Pagodabox和Heroku这样的云主机手动设置。

因此,您需要为每台计算机创建“.env”文件,并且不要在您的生产服务器上使用“.env”文件。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - skrrgwasme
编辑了我的答案。我从我的博客中复制了一些重要的注释。但是,为什么有人给我(-1)?:( - user3851143
我没有给你点踩,所以不能确定,但我认为你可能被点踩是因为这并没有真正回答问题。问题是“我的配置有什么问题?”,而你的回答是“做这个来改变你的配置……”。虽然相关,但错过了问题的重点。看看被采纳的答案,看看它在特定问题上有多直接。 - skrrgwasme
2
在我看来,这是一步倒退。指定“环境”的目的是为了能够加载该环境的正确设置,而不必诉诸于一堆条件语句来……等待它……确定我正在运行的环境。在这方面,L4要好得多——我是“本地”的——好的,加载“本地”配置。这是我唯一需要的条件语句。 - ekeyser
“配置Laravel 5环境非常容易。”这就是为什么你被投票降级的原因。我曾经能够在我的存储库中设置所有内容。现在,我应该手动管理一堆愚蠢的.env文件,而且我被告知这样做更容易。 - swt83

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