api-platform.com - API 平台无法识别真正的环境变量
问题描述
我设置了一个全新的骨架 Symfony 项目并添加了 API 平台包。我使用 make:entity 创建了一个实体,创建了一个迁移,能够成功执行迁移,现在可以在我的数据库中看到该表。
从 API swagger 文档页面(以及通过我本地终端中的 curl 请求),尝试对所有实体资源执行基本 GET 请求失败。该错误似乎是由于 API 使用 .env 文件中的 DATABASE_URL 而不是作为实际环境变量存在的 DATABASE_URL 造成的。这很容易看出,因为 .env 文件使用的是 MySQL,而我的实际环境变量使用的是 PostgreSQL。
执行printenv
显示正确的值,bin/console debug:container --env-vars
显示正确的值,并且由于迁移成功执行,Doctrine 清楚地识别出正确的环境变量。
此外,如果我从 .env 文件中删除 DATABASE_URL 行,只需尝试加载 API 就会导致 500 错误说明Environment variable not found: "DATABASE_URL".
是什么导致 API 平台忽略我的环境变量,而 Symfony 和 Doctrine 可以很好地识别它?
解决方案
原来这是 docker 配置中的一个问题。当使用 s6 overlay 作为进程管理器时,运行 PHP 的 services.d 文件需要使用with-contenv
helper 以使环境变量可用。
更换
#!/usr/bin/execlineb -P
php-fpm -R --nodaemonize
和
#!/usr/bin/with-contenv sh
exec php-fpm -R --nodaemonize
允许 PHP 查看在我的 docker-compose 文件中设置的环境变量,并且 API 平台开始按预期返回结果。
推荐阅读
- php - 在 PHP 中,如何将变量放入由 HTML 组成的 php 代码中?
- java - utf8_unicode_ci 字符串插入不正确?
- javascript - 如何使用 Id 或 Attribute 更改 TextInput 值?
- html - 两个具有相同高度的独立 flexbox 子级,没有 javascript
- c# - 在 UWP .NET Native 构建中按命名空间和名称查找类型
- embedded - 如何正确使用 TIOCGICOUNT
- ios - Cant find default values in SQLite, swift
- android - 从 Android(JAVA) 和 iOS 访问 Python 模块(目标 c)
- php - 如何在mysql数据库中插入两个不同的数组?
- javascript - 如果选项值有斜线,如何选择选项中的值