使用 Laravel 应用程序配置定义的别名覆盖包的composer.json 中定义的别名

Mar*_*ner 1 laravel laravel-backpack

我在 Laravel 5.8 应用程序中使用了 3 个包:

这些是冲突的,因为 Backpack Base 依赖于“Alert”的全局别名设置为使用 PrologueAlert。请参阅此处的使用示例\Alert

private function checkLicenseCodeExists()
{
    if ($this->app->environment() != 'local' && !config('backpack.base.license_code')) {
        \Alert::add('warning', "<strong>You're using unlicensed software.</strong> Please ask your web developer to <a target='_blank' href='http://backpackforlaravel.com'>purchase a license code</a> to hide this message.");
    }
}
Run Code Online (Sandbox Code Playgroud)

来源: https: //github.com/Laravel-Backpack/Base/blob/1.1.4/src/BaseServiceProvider.php#L264

因为我还没有购买该许可证,所以我开始看到一个错误,因为上面的代码片段试图将字符串传递给 Alert::add() 但它正在调用add()Styde\Html\Alert\Container::add( ) 它期望参数是 Styde\Html\Alert\Message 的实例,而不是在接受字符串的 Prologue 版本的 Alert 上调用它。它发出了错误的“警报”!

即使我的应用程序专门设置为使用 PrologueAlertAlert

// config/app.php

'aliases' => [
    ...
    'Alert' => Prologue\Alerts\Facades\Alert::class
]
Run Code Online (Sandbox Code Playgroud)

我发现原因是在 1.7 版本中,Styde 将他的包的别名从 HTMLServiceProvider.php 上受保护的 $globalAliases 变量移到了composer.json 自动发现部分

"extra": {
    "laravel": {
        "providers": [

        ],
        "aliases": {
            "Field": "Styde\\Html\\Facades\\Field",
            "Alert": "Styde\\Html\\Facades\\Alert",
            "Menu": "Styde\\Html\\Facades\\Menu",
            "Form": "Collective\\Html\\FormFacade",
            "Html": "Collective\\Html\\HtmlFacade"
        },
        "dont-discover": [
            "laravelcollective/html"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

来源: https: //github.com/StydeNet/html/commit/f51138fb42bef458f3f0e101b98344162b7327ba#diff-b5d0ee8c97c7abd7e3fa29b9a27d1780

现在,我的应用程序似乎优先考虑 Styde 的“Alert”别名,而不是我自己的应用程序设置值!

除了回滚到使用 Styde 1.6 版本之外,我如何强制 Laravel 将我自己定义的别名优先于通过composer.json 发现的别名?

Mar*_*ner 5

我找到了解决方案!它实际上是受到我原来帖子中的一个片段的启发。

extra您可以向应用程序添加一个部分composer.json,该部分由 Laravel 应用程序读取,并用于决定在自动发现过程中忽略哪些包,如下所示:

// composer.json
{
    ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "styde/html"
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,这允许您从有问题的包中挑选和选择别名,并在您的应用程序中根据需要定义任意数量的别名config/app.php (对于我的应用程序,我仅使用FieldStyde/Html 中的别名,因此这是我唯一拥有的别名)添加到我的应用程序配置)

我认为随着越来越多的包维护者开始利用自动发现功能,这将成为一个更广泛使用的功能。

事后思考:这是 Composer 和 Laravel 之间关系的转变。传统上,composer.json 文件只是一个包管理器,将在安装时运行,然后在应用程序运行时不会使用,但现在它是一个由应用程序读取的配置文件。我通过艰难的方式了解到这一点,因为我们的管道打包和部署用于整理生产环境中不需要的文件的代码。它删除了composer.json,导致我们的 QA 环境中再次发生错误。