У меня есть публичный пакет на packagist / composer.
Первоначально он автоматически загружался с помощью PSR-4 \ GitHubUser \ Package \ Class для файла src / Class.php.
Я хотел бы сократить это до \ Package \ Class для того же файла. Это легко сделать, изменив composer.json. Но есть ли способ сделать это с запасным вариантом для людей, использующих существующий более длинный вызов? (автозагрузка обоих?)
Что бы я хотел:
"autoload": {
"psr-4": {
"PackageName\\": "src",
"User\\OldPackageName\\": "src"}
}
Но он не регистрирует второй вызов для той же папки.
Вы должны найти способ, которым один загружаемый файл определяет правильный единственный класс или оба класса. Это может быть выполнимо, может дублировать код, расширить класс или что-то еще.
С другой стороны, вот для чего нужны несовместимые версии обновлений. Вы можете пытаться поддерживать старое имя навсегда, или вы можете сократить это наследие и поддерживать только новое имя (почему вы изменили его в первую очередь?).
Композитор не изменит namespace
строка в коде, поэтому префикс в автозагрузчике не может быть изменен по желанию — он должен быть в коде. Также обратите внимание, что для совместимости с PSR4, на который ссылается PSR1, разрешен только один класс на файл.
Какова цель этой попытки? Чтобы сделать старое имя пакета общедоступным, вы можете решить, поддерживать старую версию немного дольше, то есть применять функциональные исправления и исправления безопасности. Новая версия будет помечена с большим номером основной версии, а также поддерживается. В руководстве по миграции будет указано, что единственное требование для обновления — это изменение пространства имен, все остальное будет таким же. Это приводит к гораздо более чистому пути обновления, потому что вы можете протестировать обе версии по отдельности, и не забывать об угловых случаях.
Также у вас не возникает проблем с подсказками типов, когда класс из старого пространства имен имеет подсказку для нового класса или наоборот (и это, вероятно, невозможно изменить в коде — по крайней мере, это слишком необычно, что я хочу думать о решении).
TLDR: Используйте две основные версии для двух несовместимых с пространством имен пакетов и предоставьте пользователю простые инструкции по обновлению.
Других решений пока нет …