Как определить путь к autoload.php с помощью композитора
-
21-12-2019 - |
Вопрос
У меня есть композиторский проект, назовите его MyVendor\Database
.Этот проект использует композитор и автозагрузку.В этом проекте есть несколько файлов, которые имеют:
require_once __DIR__."/../vendor/autoload.php";
чтобы использовать автозагрузку.
Все отлично работает, пока я не включу MyVendor\Database
в другом проекте.
У меня есть еще один проект, назовите его MyVendor\CoolPackage
это требует MyVendor\Database
.
Я запускаю установку композитора на CoolPackage
и он загружается MyVendor\Database
в папку поставщика.
Однако проблема заключается в том, что мои файлы внутри vendor\MyVendor\Database
провалиться, потому что они звонят require_once __DIR__."/../vendor/autoload.php"
, но внутри нет папки поставщика \vendor\MyVendor\Database
.
Решение
В вашей composer.json
вы определяете схему автозагрузки.По причинам, которые вы сейчас выяснили сами, не рекомендуется вызывать автозагрузку Composer внутри любого из файлов, которые должны быть автоматически загружаемыми не только внутри этого приложения или модуля, но и в любом другом приложении.
По сути, файлы в любом проекте Composer должны быть разделены на основе определения автозагрузки PSR-0 или 4:Они либо ТОЛЬКО объявляют классы или функции БЕЗ каких-либо побочных эффектов (например, выполнения кода), либо выполняют код без определения классов или функций.Только предыдущие файлы могут быть загружены автоматически (за исключением функций, которые всегда можно объявить только путем загрузки файла, содержащего их, с помощью files
раздел автозагрузки), последний НЕ должен автоматически загружаться.
И тогда это должно стать относительно легко:Все классы, которые можно загружать автоматически, также можно использовать, когда этот компонент включен в другое приложение.Все остальное, что не является классом, не может использоваться напрямую.