Есть несколько вариантов решения это проблемы.
1) Некоторые могут пропагандировать сервисный слой (
design-pattern.ru/patterns/service-layer.html), как следствие: "App/Services/ServiceName" - набор классов, отвечающих за какое-то абстрактное действие. Например: "UserAvatarUploaderService", который отвечает за загрузку аватарки пользователя.
2) В качестве альтернативы и способ, который предпочитаю я - это создание директории "src" с набором независимых компонентов, включая собственный composer.json. Тот же сервис загрузки аватарки будет выглядеть следующим образом:
- src/
- AvatarUploader/
- README.md
- composer.json
- tests/ ...
- src/
- AvatarInterface.php
- FileSystemInterface.php
- FileSystemUploader.php
- UploaderInterface.php
Для подключения этой библиотеки достаточно будет прописать в корневом:
{
"repositories": [
{
"type": "path",
"url": "./src/AvatarUploader"
}
],
"require": {
"app/avatar-uploader": "*"
}
}
А выглядеть внутренний (т.е. внутри "src/AvatarUploader") composer будет так:
{
"name": "app/avatar-uploader",
"autoload": {
"psr-4": {
"AvatarUploader\\": "src/"
}
}
}
Таким образом мы запилим совершенно независимый компонент со своими тестами и зависимостями, а внутри основного приложения будем лишь к нему обращаться.