【问题标题】:Can I change the PSR 4 Autoload Namespacing with a fallback?我可以通过后备更改 PSR 4 自动加载命名空间吗?
【发布时间】:2016-07-24 10:31:25
【问题描述】:

我在 packagist/composer 上有一个公共包。

最初它为文件 src/Class.php 自动加载 PSR-4 \GitHubUser\Package\Class。

对于同一个文件,我想将其缩短为 \Package\Class。这可以通过更改 composer.json 轻松完成。但是有没有一种方法可以让使用现有较长电话的人回退? (自动加载两者?)

我想要什么:

"autoload": {
    "psr-4": {
        "PackageName\\": "src",
        "User\\OldPackageName\\": "src"
    }
}

但它不会为同一文件夹注册第二次调用。

【问题讨论】:

    标签: php composer-php autoload packagist


    【解决方案1】:

    您必须找到一种方法,使加载的一个文件定义正确的单个类或两个类。这可能是可行的,可能是复制代码、扩展类或其他方式。

    另一方面,这就是不兼容的更新版本的用途。您可以尝试永远支持旧名称,或者您可以取消这个传统并只支持新名称(为什么首先更改它?)。

    Composer 不会更改代码中的namespace 行,因此自动加载器中的前缀不能随意更改 - 它必须在代码中。另请注意,为了与 PSR1 引用的 PSR4 兼容,每个文件只允许一个类。

    这次尝试的目标是什么?为了使旧包名称对公众可用,您可以决定支持旧版本的时间更长一点,即应用功能和安全修复。新版本将标有更高的主要版本号,并且也受支持。迁移指南会指出,更新的唯一要求是更改命名空间,其他任何内容都是相同的。这导致升级路径更加清晰,因为您可以单独测试两个版本,并且不要忘记极端情况。

    此外,当旧命名空间中的类具有新类的类型提示时,您也不会遇到类型提示问题,反之亦然(这可能无法在代码中更改 - 至少它太不常见了我想考虑一个解决方案)。

    TLDR:对两个命名空间不兼容的包使用两个主要版本,并为用户提供易于操作的升级说明。

    【讨论】:

    • 谢谢,非常全面的回答。原因比任何东西都更美观,我很想知道是否可能......我正在考虑恢复而不是现在改变它(即使我不喜欢它,改变它会很痛苦)
    猜你喜欢
    • 2015-08-23
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2021-10-13
    • 2014-09-24
    • 2015-12-03
    • 2016-01-22
    相关资源
    最近更新 更多