我在我的Laravel5.8应用程序中使用了3个软件包:
这些冲突是因为背包基础依赖全球别名的“警报”设置为使用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\ Alert \Container::add()上的add()
方法,它希望参数是Styde\Html\Alert\Message的一个实例,而不是在序言中接受字符串的Alert版本上调用它。它叫错了“警报”!
即使我的应用程序被专门设置为将PrologueAlert用于Alert
// config/app.php
'aliases' => [
...
'Alert' => Prologue\Alerts\Facades\Alert::class
]
我发现原因是在版本1.7中,Styde将其包的别名从HTMLServiceProvider.php上的受保护的HTMLServiceProvider.php变量移到了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"
]
}
}
现在,我的应用程序似乎在优先考虑Styde的别名"Alert“而不是我自己的应用程序设置值!
除了回滚到使用版本1.6的Styde之外,我如何能够强迫Laravel将自己定义的别名优先于通过composer.json发现的别名?
发布于 2019-06-20 15:36:54
我找到解决办法了!它实际上是受我最初帖子中的一个片段的启发。
您可以将extra
部分添加到应用程序的composer.json
中,该部分由Laravel应用程序读取,用于决定在自动发现期间忽略哪些包,如下所示:
// composer.json
{
...
"extra": {
"laravel": {
"dont-discover": [
"styde/html"
]
}
}
}
这样,您就可以从有问题的包中选择别名,并在config/app.php
中定义尽可能多或更少的别名(对于我的应用程序,我只使用了Styde/Html中的Field
别名,因此这是我必须添加到App中的唯一别名)。
我认为,随着越来越多的包维护人员开始利用自动发现功能,这将成为一个更广泛使用的特性。
事后想:这是作曲家和拉勒维尔之间关系的一个转变。传统上,composer.json文件只是一个包管理器,在安装时运行,然后在应用程序运行时不使用,而现在它是应用程序读取的配置文件。当我们的管道打包和部署用于清理生产环境中不需要的文件的代码时,我很难理解这一点。它删除了在我们的QA环境中再次启动错误的composer.json。
https://stackoverflow.com/questions/56684491
复制相似问题