Следующая ситуация:
Мы работаем в MVC фреймворке.
Тонкие контроллеры, толстые модели, сервисы - все прекрасно.
Необходимо спроектировать некую страницу, на которой выводятся много значений статистики.
Потом будет еще одна такая страница и так далее.
Чтобы было понятно о чем речь, пример (в реальности нечто другое):
количество квартир с одной дверью,
разница между размерами квартир с четырьмя дверьми и одним стулом,
количество зонтов с одной ручкой,
количество рук у владельцев зонтов с одной ручкой и красным цветом,
количество квартир с десятью стульями, где стоят зонты
и так далее...
Главное на странице выводится где-то 50 значений таких данных.
Есть у нас сервисы которые все это подсчитывают.
RoomService()->forDoor(1)->count();
RoomService()->forDoor(2)->sumArea()
RoomService()->forDoor(4)->forChair(1)->diff()
UmbrellaService()->forPart(1)->count()
Вопрос в следующем - где правильнее вызывать эти сервисы?1) В контроллере
Можно вызвать их в контроллере, сохранить в переменные и пихнуть во вьюшку.
$roomsOne = RoomService()->forDoor(1)->count();
return View()->withData($roomsOne)
Но! получим большой контроллер, в котором 50 строчек кода, как минимум.
В общем - огромный контроллер и таких контроллеров много.
2) Непосредственно во вьюшке
Можно вызывать их непосредственно из вьюшки.
<td>
<span>Володя купил тараканов на рынке</span>
<div>{{ RoomService()->forDoor(4)->forChair(1)->diff() }}</div>
</td>
Тоже кажется не айс, потому что вся вьюшка будет перегружена такими запросами
и код переплетется с выводом, а ведь есть еще и такое
RoomService()->forDoor(4)->forChair(1)
->forName(PersonService()->forMaxAlpha())
->withoutName(PersonService()->getDirectorNames())
->sumArea()
3) В хелпер
Есть вариант создать некий хелпер только для этой страницы
class PageHelper
{
countRoomWithDoor()
RoomService->forDoor(1)->count()
areaRoomWithTwoDoorAndForDirector()
RoomService->forDoor(2)->forDirector()->count()
diffRoomWithTwoDoorAndForDirectorAndWithoutUmbrella()
RoomService->forDoor(2)->forDirector()->withoutUmbrell()->diff()
}
Но опять же 50, пусть и довольно простых функций в классе, смешанных непонятно как.
4) В сервисах
Можно разложить эти функции из хелпера по сервисам.
Но так как таких страниц тоже штук 50 и на каждой своя функция, то сервисы лопнут от количества функций.
Итог
Я остановился пока на отдельном длинном хелпере для каждой страницы.
Как лучше, может, вообще по другому?