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的主要内容,如果未能解决你的问题,请参考以下文章
laravel / lumen 访问中间件中的 .env 值