提问者:小点点

我可以用回退更改PSR 4自动加载名称空间吗?


我有一个关于packagist/composer的公共软件包。

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

对于同一个文件,我想将其缩短为\Package\Class。这是很容易做到的改变作曲家。json。但是,有没有一种方法可以让使用现有较长通话的人退后?(两个都自动加载?)

我想要的是:

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

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


共1个答案

匿名用户

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

另一方面,这就是不兼容的更新版本的用途。您可以尝试永远支持旧名称,也可以删去这一传统,只支持新名称(为什么一开始就更改它?)。

Composer不会更改代码中的命名空间行,因此不能随意更改自动加载程序中的前缀-它必须在代码中。还要注意,为了与PSR1引用的PSR4兼容,每个文件只允许一个类。

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

另外,当旧名称空间中的类对新类具有typehint时,您也不会遇到类型提示问题,反之亦然(这可能不可能在代码中更改-至少我想考虑解决方案的情况太少见了)。

TLDR:对两个名称空间不兼容的包使用两个主要版本,并向用户提供易于执行的升级说明。