композитор с файлами, не использующими автозагрузку psr0 и psr4 (проект symfony)

У меня проблема с автозагрузчиком композитора. Сейчас работаю над приложением, которое было разработано около 10 лет назад. Структура папок двух библиотек, используемых в настоящее время в проекте, не соответствует правилам автозагрузки psr0 и psr4.

Структура после установки композитора выглядит следующим образом

Пример 1

Путь к папке: /vendor/AppBook/ORS/class/model/Country

Имя файла: class.Country.php

Название класса PHP: Страна

Пример 2

Путь к папке: /vendor/AppBook/ORS/class/model/Country

Имя файла: class.CountryCollection.php

Имя класса PHP: CountryCollection

Посоветуйте, пожалуйста, что мне сделать, чтобы автозагрузчик композитора смог обнаружить эти файлы.

заранее спасибо


person shobekhan    schedule 21.04.2016    source источник


Ответы (2)


Из документов:

Вы можете использовать поддержку создания карты классов, чтобы определить автозагрузку для всех библиотек, которые не соответствуют PSR-0/4. Чтобы настроить это, вы указываете все каталоги или файлы для поиска классов.

Пример:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

Вы по-прежнему можете добавить composer.json в свои устаревшие библиотеки и определить для них тип автозагрузки classmap.

person Jakub Zalas    schedule 21.04.2016
comment
если я добавлю автозагрузку в composer.json устаревших библиотек, это сработает - person shobekhan; 22.04.2016
comment
Но если я добавлю в composer.json моего проекта, репозитории не будут работать: [ { type: package, package: { name: shoaib/test, type: package, version: master, source: { url: github.com/shobekhan/test.git, тип: git, ссылка: master }, автозагрузка: { classmap: [ Кэш/] } } } ] - person shobekhan; 22.04.2016
comment
Вам нужно поместить раздел автозагрузки в composer.json вашего пакета shoaib/test. В качестве альтернативы, если у вас нет контроля над пакетом, вы можете попробовать определить его на верхнем уровне вашего composer.json, но я не уверен, что это сработает. - person Jakub Zalas; 22.04.2016
comment
Я понял, что добавление настроек карты классов автозагрузки в json-файл моего проекта не добавляло настройки карты классов автозагрузки в файл composer.lock, когда я выполнял обновление композитора. Что я сделал тогда, так это то, что я удалил пакет и добавил его снова. На этот раз настройки карты классов автозагрузки были правильно показаны, и проект смог найти файлы. Я не знаю, есть ли лучший способ сделать это в композиторе. - person shobekhan; 22.04.2016

Вы можете переименовать эти файлы, чтобы сделать их совместимыми с PSR-4 (маловероятно, потому что это требует использования пространств имен - в коде 10-летней давности?) или PSR-0. Кроме того, вы должны удалить любую явную загрузку этих файлов через include, include_once, require или require_once, поскольку имена файлов изменились.

PHP автоматически загрузит эти классы по имени класса. Это может привести к проблемам, если чувствительность к регистру в имени класса не соблюдается везде. Пример:

class UpperCase {}

$a = new upperCase();

Автозагрузка попытается найти файл, оканчивающийся на upperCase.php, который не будет соответствовать требуемому PSR-0 UpperCase.php, поэтому код завершится ошибкой. Однако это сработает, и ситуация не улучшится:

class UpperCase {}

$b = new UpperCase();
$a = new upperCase();

Причина в том, что PHP обрабатывает имена классов без учета регистра, поэтому после загрузки класса вы можете использовать любой регистр в его имени. Только первое вхождение в вашем пути к коду должно совпадать. Проблема в том, чтобы быть уверенным, где это на самом деле, поэтому, по сути, это должно быть правильно везде.

Да, функция classmap — более простой способ. Но вы все равно захотите удалить вызовы include/require, чтобы немного оптимизировать производительность, так что вам все равно придется прикасаться к коду. И несмотря на возраст, его приходится поддерживать - так почему бы не сделать это полноценно, перейдя на всем известный стандарт автозагрузки. Это поможет вам в долгосрочной перспективе, когда вам придется параллельно поддерживать классы, совместимые с PSR-0/4, и этот старый код.

person Sven    schedule 21.04.2016
comment
Ваша идея — лучшее решение в долгосрочной перспективе. - person shobekhan; 22.04.2016