首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Laravel配置定义了包的composer.json中定义的别名

用Laravel配置定义了包的composer.json中定义的别名
EN

Stack Overflow用户
提问于 2019-06-20 10:56:18
回答 1查看 1.1K关注 0票数 1

我在我的Laravel5.8应用程序中使用了3个软件包:

这些冲突是因为背包基础依赖全球别名的“警报”设置为使用PrologueAlert。在这里,请参见它如何使用\Alert的示例:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
// config/app.php

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

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

代码语言:javascript
运行
复制
"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“而不是我自己的应用程序设置值!

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-20 15:36:54

我找到解决办法了!它实际上是受我最初帖子中的一个片段的启发。

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

代码语言:javascript
运行
复制
// composer.json
{
    ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "styde/html"
            ]
        }
    }
}

这样,您就可以从有问题的包中选择别名,并在config/app.php中定义尽可能多或更少的别名(对于我的应用程序,我只使用了Styde/Html中的Field别名,因此这是我必须添加到App中的唯一别名)。

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

事后想:这是作曲家和拉勒维尔之间关系的一个转变。传统上,composer.json文件只是一个包管理器,在安装时运行,然后在应用程序运行时不使用,而现在它是应用程序读取的配置文件。当我们的管道打包和部署用于清理生产环境中不需要的文件的代码时,我很难理解这一点。它删除了在我们的QA环境中再次启动错误的composer.json。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56684491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档