Композитор, итерация автозагрузки PSR-4

В настоящее время я использую Slim и Twig, моя структура папок выглядит следующим образом.

/application/modules

В моем composer.json у меня есть

"autoload": {
    "psr-4": {
        "Application\\":        "application/modules/",
        "Core\\":               "application/",
        "Middleware\\":         "application/slim/middleware/"
    }
}

Моя проблема в том, что в Application\modules\ у меня есть каталог для каждого модуля. Теперь мой вопрос: возможно ли заставить композитор перебирать подкаталоги при использовании автозагрузки PSR-4?


person Ian    schedule 22.06.2014    source источник
comment
Я считаю, что для PSR-4 требуется явное объявление.   -  person Ohgodwhy    schedule 22.06.2014
comment
Я так и думал, но надеялся, что есть способ сделать это.   -  person Ian    schedule 22.06.2014
comment
Я собираюсь посмотреть этот вопрос, потому что мне тоже интересно. Я сталкивался с этой проблемой раньше, и я никогда не находил способ ее обойти.   -  person Ohgodwhy    schedule 22.06.2014
comment
После определения префикса пространства имен каждый подкаталог сопоставляется один к одному с дополнительными пространствами имен с учетом регистра. Итак, Application\foo\Bar посмотрит на application/modules/foo/Bar.php. Меня это так часто сбивает с толку, что я решил, наконец, запомнить это с помощью запишите!   -  person bishop    schedule 09.01.2015


Ответы (1)


Я вижу проблему с вашей декларацией PSR-4.

Вы не должны помещать «основные» классы в папку, в которой есть подпапки для других пространств имен.

Автозагрузка PSR-4 в Composer работает следующим образом: если полное имя класса для загрузки совпадает с префиксом, объявленным в любом из определений PSR-4, то префикс, упомянутый в префиксе, удаляется из имени класса, а оставшееся имя класса сопоставляется с именем файла и выполняется поиск.

Если у вас есть классы с именем Application\ в папке application/modules, и у вас есть классы с именем Core\ в папке application, то технически Composer может найти файлы, соответствующие имени класса, например Core\modules\Whatever, хотя вместо этого эти файлы будут содержать класс Application\Whatever.

Я рекомендую переместить все классы Core в свою папку и указать на это в объявлении PSR-4.

Проблема с вашим первоначальным вопросом заключается в том, что вы опускаете важную информацию: какова структура класса и файла для ваших модулей?

Автозагрузчик Composer с радостью разрешит любой класс, который начинается с префикса пространства имен Application, удалит этот префикс из имени класса, преобразует остатки в имя пути и найдет этот файл в application/modules/. Учитывая, что у вас модуль класса Application\MyModule\Foobar, он будет искаться в application/modules/MyModule/Foobar.php. Почему? Потому что префикс Application будет удален, чтобы можно было использовать более короткие имена путей в PSR-4. (Использование PSR-0 означает, что у вас должна быть папка для каждого уровня пространства имен в имени класса.)

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

person Sven    schedule 22.06.2014