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

时间:2019-06-20 10:56:18

标签: laravel backpack-for-laravel

我在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.");
    }
}

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

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

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

// config/app.php

'aliases' => [
    ...
    'Alert' => Prologue\Alerts\Facades\Alert::class
]

我发现原因是在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"
        ]
    }
}

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

现在,看来我的应用程序将Styde的别名“ Alert”优先于我自己的应用程序设置值!

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

1 个答案:

答案 0 :(得分:2)

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

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

// composer.json
{
    ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "styde/html"
            ]
        }
    }
}

然后,您可以从有问题的软件包中选择别名,并在config/app.php 中定义任意数量的别名(对于我的应用程序,我只使用了{{ 1}}来自Styde / Html的别名,因此这是我唯一需要添加到我的应用程序配置中的别名)

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

事后思考:这是Composer和Laravel之间关系的转变。传统上composer.json文件只是一个软件包管理器,该软件包管理器将在安装时运行,然后在应用程序运行时不使用,而现在它是一个由应用程序读取的配置文件。当我们的管道打包并部署用于整理生产环境中不需要的文件的代码时,我很难学到这一点。它正在删除composer.json,这开始在我们的QA环境中再次发生该错误。