Фича, которая помещается в одну папку
LaraBoom держит ресурс, поля и Service рядом. Host routes и app/Http это папки, которые я не создаю.
Утро ушло на баг картинки заметок по пяти деревьям Laravel. Модель в app/Models, контроллер в app/Http, FormRequest рядом, сервис в app/Services, сидер в database. Путь загрузки в одном файле не совпал с URL, который ждала сетка Vue. Host routes/ и app/Http это папки, которые прятали расхождение.
LaraBoom кладёт определение, атрибуты и Service в Resources/Note. Маршруты так же, в Routes/Auth. В host-приложении нет routes/, нет app/Http, нет верхнего Services. JSON живёт под /api.
Посетитель раскладку папок не видел. Я видел, каждый раз, когда плитка указывала на файл, который маршрут положил в другое место. Это не вкус. Это правило, чтобы маленькое портфолио не вырастило второй фреймворк внутри первого.
Чем владеет Service
Хранение картинок, нормализация значений и seed-строки ушли из тел маршрутов в Service. Метод маршрута читается как валидация, вызов сервиса, возврат ресурса. Два одинаковых нормализатора картинок стали видны и слились.
Следующий разрез это размер. Сервис, который и файлы кладёт, и HTML форматирует, это две работы. Граница идёт по данным, не по экрану. Картинки заметок остаются у Note. Cookie авторизации у Auth. SharedImageService я не завожу, пока третий ресурс не скопирует те же десять строк.
Когда санитайз HTML лег рядом с ключами списка Redis в одном Service, сброс кэша начал зависеть от DOM-хелпера. Тест сброса падал на смене строки в подписи фигуры. Colocation это не один файл на весь продукт. Это одна папка на ресурс и Service, у которого всё ещё одна работа.
Сиды как спецификация
Каждая seed-строка несёт en, ru и de. Это поймало форму, которая сохраняла только активную локаль и теряла две другие. Ещё это гоняет сетку: короткие заголовки, длинные, без картинок, каждый размер плитки.
Цена в том, что три языка держатся руками. Правило: пустой локали в сиде нет, и тест это проверяет. Когда файл Service вырос больше экрана HTML сидов, статьи уехали в Note/Articles. Так уже вышло. Файл ресурса остался маленьким.
Паттерны Demo в пакете это вторая половина спецификации. Если host заводит namespace контроллеров, следующая фича его скопирует. Сначала читаю ресурс Demo, потом добавляю папку host в том же виде. Тесты бьют в /api, не в именованную группу маршрутов, которую пришлось бы собирать в routes/web.php.
Какой опыт из этого
Когда фича ломается, открываю одну папку. Если для пути картинки нужно пять деревьев, фича уже вышла из формы LaraBoom.
Host app/Http и Shared-сервису на две копии десяти строк я не верю. Маршрут валидирует, Service делает работу, ресурс отдаёт JSON под /api.
Правило, которое оставляю: сидить все три локали, уносить HTML статей из Service, когда он не влезает в один экран, совпадать с Demo. Второго фреймворка в host нет.
