即使设置了值,是否也会评估 .env 回退?

Is .env fallback evaluated even though the value is set?

给定以下行:

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

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

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

的问题

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

提前致谢

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

您可以在 checking the code 上看到 Github。

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

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

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