我可以使用后备更改 PSR 4 自动加载命名空间吗?

Can I change the PSR 4 Autoload Namespacing with a fallback?

我在 packagist/composer 上有一个 public 包裹。

最初它使用 PSR-4 \GitHubUser\Package\Class 为文件 src/Class.php.

自动加载

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

我想要什么:

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

但它没有注册同一文件夹的第二次调用。

您必须找到一种方法,使加载的一个文件定义正确的单个 class,或两个 class。它可能是可行的,也许复制代码,扩展 class 或其他东西。

另一方面,这就是不兼容更新版本的目的。你可以尝试永远支持旧名称,或者你可以削减这个遗产,只支持新名称(为什么你一开始就改了?)。

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

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

此外,当来自旧名称空间的 class 具有新 class 的类型提示时,反之亦然(这是可能无法更改代码 - 至少我想考虑解决方案的情况太少见了)。

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