Код должен быть такой, чтобы открыл файл и понял логику. Без документаций и комментариев. Такое у меня получается делать только с большим количеством файлов. Т.е. по-максимуму задействовать функционал Лары (там уже куча своих классов) – это в первую очередь. Остальное в своих классах. Основные простыни у меня в моделях т.к. все запросы через scope(чтобы быстро компоновать новые запросы из скоупов-частей). Решаю использованием трейтов – убираю туда скопы по темам, чтобы быстро получить доступ к группе связанных запросов и быстро их править или составить новый. Некоторые такие трейты использую в разных моделях. Например скоупы ofActive/ofApproved можно дофига где использовать. Также делаю репозитории и сервисы. Не потому что надо, а потому что мне так удобней. Т.е. книг совершенная архитектура не читал, пару раз загуглил, но там люди не особо убедительно объясняют (либо я не догоняю), поэтому делаю как нравится мне. Цель -простота и наглядность логики. Чтобы запускалась не страница кода, а класс. Все изолировано и с проверкой аргументов. И есть возможность быстро поменять логику (по методу кирпичиков). Сервис классы - логика, проверить, запустить, исполнить итд. Репозитории чтобы сформировать массив данных для фронта. Коллекции, наборы роутов, текстов и т.д. Обычно создаю базовую репу от которой наследуются остальные, т.к. много общих данных. Минимум абстракций и автоматизаций, конкретные понятные прямые действия с минимумом if. Короче много файлов, в каждом минимум кода, все поделено. Но это мой непрофессиональный опыт т.к. профильные вузы не заканчивал, в гугле не работал, занимаюсь своими проектами и ответом нужно пользоваться с осторожностью.