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

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

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

Пример 1

Путь к папке: / vendor / AppBook / ORS / класс / модель / Страна

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

Имя класса PHP: Страна

Пример 2

Путь к папке: / vendor / AppBook / ORS / класс / модель / Страна

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

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

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

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

3

Решение

От документы:

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

Пример:

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

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

2

Другие решения

Вы можете переименовать эти файлы, чтобы сделать их совместимыми с 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 обрабатывает имена классов без учета регистра, поэтому после загрузки класса вы можете использовать любой регистр в его имени. Это только первое вхождение в пути кода, которое должно совпадать. Проблема в том, чтобы быть уверенным, где это на самом деле, поэтому, по сути, это должно быть везде правильно.

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

0

По вопросам рекламы [email protected]