【问题标题】:Is .env fallback evaluated even though the value is set?即使设置了值,是否也会评估 .env 后备?
【发布时间】:2021-01-27 16:25:57
【问题描述】:

鉴于以下行:

env('AN_ENV_KEY', file_exists('my\path') ? 'value' : 'other-value');

即使在.env 文件中指定了AN_ENV_KEY,是否也会评估回退?

我问这个是因为在我的服务器中,项目更新后,其中一个依赖项在其更改中添加了类似的行,现在部署失败,即使我指定了 AN_ENV_KEY=value,因为 @ 的一些权限问题987654325@部分

我只是对此感到好奇,因为我的假设是如果设置了值,则应该省略回退。

提前致谢

【问题讨论】:

  • 你能分享更多细节吗? “部署失败”听起来你可以调试发生的任何事情
  • 你在哪里打这个env电话?
  • 当然,错误是这个file_exists(): open_basedir restriction in effect.,但我明白了,因为后备file_exists(...) 导致了这个问题。我不明白为什么当AN_ENV_KEY 值设置在.env 时它会到达代码的那一部分
  • @lagbox 调用由依赖项完成。我在调试部署错误时到达了那条线。
  • 依赖项在哪里,在配置文件中?如果他们是从配置文件中执行此操作并且您缓存了配置,则不会加载“.env”

标签: php laravel laravel-8 php-7.3


【解决方案1】:

由于您要定义此环境变量,因此您应该更改此配置文件。这里有 2 个参数传递给 env,并且它们都必须在传递给函数时解析。这是在函数运行之前,所以无论该 env 变量是否存在,file_exists 调用无论如何都会发生。

您可以删除使用 file_exists 的表达式,因为您正在设置环境变量。

env('USER_MODEL', 'some sane default?');

这很好,因为你应该发布这个配置文件,所以它在你的应用程序配置中,所以你现在可以控制它。

第 2 部分

现在您的配置文件版本已修复,我们不希望合并包的配置文件,因为它仍会尝试每次调用file_exists。为此,我们将扩展他们的提供者并覆盖register 方法。然后我们会将您的提供者版本添加到提供者列表中,并告诉自动发现系统忽略此包(因此它不会注册其提供者或别名):

app/Providers/SomeCoolNamedProvider:

namespace App\Providers;

use Silvanite\Brandenburg\Providers\BrandenburgServiceProvider;

class SomeCoolNamedProvider extends BrandenburgServiceProvider
{
    public function register()
    {
        // in their version they merge the config here
        // but we don't want that, so leave this blank
    }
}

config/app.php:

$providers = [
    ...
    App\Providers\SomeCoolNamedProvider::class,
];

$aliases = [
    ...
    'BrandenburgPolicy' => Silvanite\Brandenburg\Facades\PolicyFacade::class,
];

composer.json:

"extra": {
    "laravel": {
        "dont-discover": [
            "silvanite/brandenburg"
        ]
    }
},

您可以在此之后运行自动发现命令,php artisan package:discover

【讨论】:

  • 我在配置发布后就这样了,但它仍然尝试使用包配置文件。很奇怪
  • 正确,因为他们的配置文件仍在加载,无论如何......因为我认为他们在他们的配置文件中的东东很愚蠢,我会覆盖他们的提供者而不合并他们的配置文件。 ..如果你愿意,我可以给你一个例子如何做到这一点
  • @KennyHorna 好吧,试试这个更新
  • 是的,我正在部署它。完成后会更新
  • 是的,我稍后会尝试查看包代码,看看是否可以通过 PR 来解决它,因为由于某种原因,配置值没有与已发布的值合并并继续依赖于包配置文件。无论如何,至少目前问题解决了。祝你有美好的一天。
【解决方案2】:

不,如果在.env 文件中找到该值,则不会评估回退。如果设置了值,则返回。

你可以在 Github 上通过 checking the code 看到。

【讨论】:

  • 是的,回退被评估,它是一个作为函数参数的表达式,所有表达式都被解析,因为它们需要传递给函数
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2012-05-18
相关资源
最近更新 更多