【问题标题】:How do nested variables within the .env file work in CodeIgniter 4.env 文件中的嵌套变量如何在 CodeIgniter 4 中工作
【发布时间】:2020-10-20 05:42:28
【问题描述】:

在 Codeigniter4 站点的“嵌套变量”部分下:

“为了节省输入,您可以通过将变量名称包装在 ${...} 中来重用您已经在文件中指定的变量” link to CI nesting Variables section

文档中的示例:

BASE_DIR="/var/webroot/project-root"

CACHE_DIR="${BASE_DIR}/cache"

TMP_DIR="${BASE_DIR}/tmp"

我正在尝试使用以下内容

app.baseURL = 'http://localhost:8080/'

google.redirect = ${app.baseURL}Google

但是,它在 print_r($_ENV) 时将其分配为文字

[google.redirect] => ${app.baseURL}Google

我尝试使用包括 BASE_DIR 在内的非命名空间键(根据示例),它一直作为文字打印。

有什么奇怪的 - 当我使用以下内容时:

CI_ENVIRONMENT = development

google.redirect = ${CI_ENVIRONMENT}Google

print_r 为时的结果:

[CI_ENVIRONMENT] => development

[google.redirect] => developmentGoogle

我的问题是 - 我做错了什么和/或应该如何正确设置/使用这些?

根据文档,我应该能够使用 .env 文件中已经使用分配的任何键

${somekeyinthisfile}

【问题讨论】:

  • 您使用正确。我一直在闲逛,看来正则表达式不允许 . (点)。我还在找。
  • 即使不使用这些点 - 我仍然无法让它在没有 CI_ENVIRONMENT 的情况下工作。使用 x = test somerandomvariablename = foo 它仍然读取为文字: [google.redirect] => ${x}GoogleLogin [google.redirect] => ${somerandomvariablename}GoogleLogin
  • 啊哈,所以我想知道为什么我没有得到同样的东西......现在我想出了一个新的库文件来覆盖现有的 system\config\DotEnv.php 方法load() 和 resolveNestedVariables()。那么,目前这不起作用,您有多痛苦?
  • 不太痛。我刚从 CI3 过来,只是在玩 CI4 以开始迁移我的站点的过程。如果它只是等到主代码中有修复 - 我可以等待。我一点也不着急。
  • 好的 - 我有一个凌晨 4 点的“补丁”,可以让它唱歌跳舞,但它涉及直接更改 DotEnv.php 核心文件,在这种情况下这可能不是一件坏事...另一种方法是创建一个新的 DotEnv.php ,它只是覆盖这些方法...所以 ole - 在不直接更改系统文件的情况下更改内容。两者都很有趣 :) 所以这是一个有趣的小调试会话 :)

标签: codeigniter codeigniter-4


【解决方案1】:

看了一会儿,有一个更新的文件在 https://github.com/codeigniter4/CodeIgniter4/blob/develop/system/Config/DotEnv.php 随着所有“其他”的变化......

这是一个错误修复。所以得到那个文件,你会很高兴的。

我很确定我的意图不是允许 app.xxx 设置用作变量,因为文档清楚地显示了,而不是 显示它们被使用。 (是的,现在是早上 6 点……)

但这是您的代码,您可以随意使用...所以如果您想使用 app.xxx 作为变量...

唯一缺少的是正则表达式中的点 (.)

如果您查看 第 272 行 - system/Config/DotEnv.php 方法 resolveNestedVariables() 并添加 . (点)进入正则表达式,这将使您的所有 app.things 工作。

  $value = preg_replace_callback(
     '/\${([a-zA-Z0-9_.]+)}/',
     function ($matchedPatterns) use ($loader) {

我在[a-zA-Z0-9_ 的末尾添加了一个点 (.)

所以
'/\${([a-zA-Z0-9_]+)}/',

变成

'/\${([a-zA-Z0-9_.]+)}/',

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多