2016-04-21 11 views
2

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

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

Пример 1

Путь к папке:/продавец/AppBook/ПРС/класс/модель/Страна

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

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

Пример 2

Путь к папке:/продавец/AppBook/ПРС/класс/модель/Страна

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

PHP Название класса: CountryCollection

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

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

ответ

2

the docs От:

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

Пример:

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

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

+0

если добавить автозагрузку в composer.json устаревших библиотек она работает – shobekhan

+0

Но если я добавить в composer.json моего проекта не работают «хранилищ»: [{ «типа»: «пакет» , "пакет": { "имя": "Shoaib/тест", "типа": "пакет", "версия": "мастер", "источник": { "URL": «https: //github.com/shobekhan/test.git ", " type ":" git ", " reference ":" master " }, " autoload ": { "classmap": ["Cache /"] } } } ] – shobekhan

+0

Вам необходимо поместить раздел автозагрузки в composer.json вашего пакета shoaib/test. В качестве альтернативы, если у вас нет контроля над пакетом, вы можете попробовать определить его на верхнем уровне вашего composer.json, но я не уверен, что это сработает. –

0

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

+0

Ваша идея - лучшее решение в долгосрочной перспективе. – shobekhan