Lumen 在请求期间不会从系统中读取 env

Posted

技术标签:

【中文标题】Lumen 在请求期间不会从系统中读取 env【英文标题】:Lumen does not read env from system during request 【发布时间】:2017-10-22 10:17:12 【问题描述】:

Lumen 5.4、mysql 和 Docker。我在全局 env 中有以下变量

$ printenv
DB_HOST=127.0.0.1
DB_DATABASE=database
etc

.env 在我的项目中也存在,但它们具有不同的值。

如果我输入 tinker env('DB_HOST'),它会从全局环境中打印值,但是当应用程序运行时,它会从指定的 .env 文件中获取。我认为问题存在于Laravel\Lumen\Application 中的以下函数中:

/**
 * Load a configuration file into the application.
 *
 * @param  string  $name
 * @return void
 */
public function configure($name)

    if (isset($this->loadedConfigurations[$name])) 
        return;
    

    $this->loadedConfigurations[$name] = true;

    $path = $this->getConfigurationPath($name);

    if ($path) 
        $this->make('config')->set($name, require $path);
    

如何覆盖这些值或使其避免这些情况:isset($this->loadedConfigurations[$name])

【问题讨论】:

您不引用env(),而是引用config() 文件并在其中处理全局与本地环境的逻辑。永远不要直接引用.env() 文件。 @Ohgodwhy 当然你是对的,但在这种情况下并非如此。我使用 Docker 的系统 env's,我只想用 Docker 环境中的给定值覆盖本地 .env 中的这些值。案例就是如何避免上面提到的自动加载配置。 阅读此***.com/questions/30822695/… 【参考方案1】:

我仍然认为,关于我的评论,答案保持不变。如果您希望使用 docker 环境变量而不是本地 .env 变量,那么 config 目录仍然是可行的方法。在这种情况下,您似乎希望以database host 为目标。所以让我们这样做:

在您的 config/database.php 文件中,更改以下内容:

'mysql' => [
    //...
    'host' => getenv('DB_HOST') ?: env('DB_HOST', 'defaultvalue')
] 

然后只通过配置文件引用主机。

config("database.mysql.host");

如果存在,您将从 docker 容器中获取 ENV,否则您将从 .env 文件中获取 DB_HOST 声明。

【讨论】:

以上是关于Lumen 在请求期间不会从系统中读取 env的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 8 不使用 .env.testing

Laravel / Lumen 只读模型?

laravel / lumen 访问中间件中的 .env 值

如何在 Lumen 中使用多个数据库

Laravel/Lumen 5.3.3:在迁移中覆盖 env 值

关于Lumen / Laravel .env 文件中的环境变量是如何生效的