【发布时间】:2020-03-25 17:51:34
【问题描述】:
PSR-1 包含推荐2.3. Side Effects:
一个文件应该声明新的符号(类、函数、常量等)并且不会引起其他副作用,或者它应该执行具有副作用的逻辑,但不应该两者都做。
在 config.php 文件中考虑这个示例(我自己的):
/**
* Parsing the database URL.
* DATABASE_URL is in the form:
* postgres://user:password@hostname:port/database
* e.g.:
* postgres://u123:pabc@ec2.eu-west-1.compute.amazonaws.com:5432/dxyz
*/
$url = parse_url(getenv('DATABASE_URL'));
define('DB_HOST', $url['host']);
define('DB_NAME', substr($url['path'], 1)); // get rid of initial slash
define('DB_USER', $url['user']);
define('DB_PASSWORD', $url['pass']);
如果我这样做,我实际上是在不尊重建议。 phpcs 理所当然地抱怨它,因为变量:
FILE: config.php
-----------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
-----------------------------------------------------------------------------------------------------------------
1 | WARNING | A file should declare new symbols (classes, functions, constants, etc.) and cause no other side
| | effects, or it should execute logic with side effects, but should not do both. The first symbol
| | is defined on line 17 and the first side effect is on line 162.
-----------------------------------------------------------------------------------------------------------------
另一种选择是:
define('DB_HOST', parse_url(getenv('DATABASE_URL'))['host']);
define('DB_NAME', substr(parse_url(getenv('DATABASE_URL'))['path'], 1));
define('DB_USER', parse_url(getenv('DATABASE_URL'))['user']);
define('DB_PASSWORD', parse_url(getenv('DATABASE_URL'))['pass']);
没有变量,没有问题。但这是湿的,难以阅读。
我知道建议就是这样,它说的是“应该”,而不是“必须”。但这仍然困扰着我......一方面,任何时候我检查文件 phpcs 都会抱怨它,但每行只报告一次,从而为添加更多在配置文件中没有位置的“副作用”敞开大门。
我对整个 PSR 还是很陌生。
我是否错过了任何巧妙的方法来摆脱变量,同时保持可读性?
推论是:坚持严格遵守建议的严肃项目如何处理这个问题?
【问题讨论】:
-
我不会在定义中使用任何函数。你不能保证结果总是一样的。在这种情况下,我将使用具有硬编码值的不同配置文件,例如 live.conf.php 和 dev.conf.php。根据您包含一个或另一个文件的环境。
-
但是我会将凭据提交给 git,这绝不是一个好主意。在本地使用 .env 和在 prod 中使用 Heroku,不想停止使用它们。
-
这个概念是拥有完全不同的配置。您可以 .gitignore 它们,只需将 example.conf.php 放入存储库。
-
你在使用任何依赖注入容器(DI容器)吗? / 项目中常量的最佳使用:常量应该在 .env 文件中找到,或者作为类常量。所以没有
define()。 / 你真的需要解析一个 db url 吗?建议:定义需要的.env常量(DB_DSN、DB_USER、DB_PASSWORD等),在需要的地方直接使用。 -
@dakis 感谢有关避免
define()s 的提示。尚未使用任何依赖注入。在 prod 中,我在 Heroku 上,将应用程序链接到其数据库的标准方法是通过DATABASE_URL=postgres://u123:pabc@ec2.eu-west-1.compute.amazonaws.com:5432/dxyz设置(超级类似于 .env),所以我宁愿在 dev 中使用类似的方法。我想我可以将解析移到另一个文件,然后putenv()。
标签: php standards psr-1 php-fig