@cloud_zurbag

Где правильнее разместить функции для вьюшки?

Следующая ситуация:
Мы работаем в 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 и на каждой своя функция, то сервисы лопнут от количества функций.

Итог
Я остановился пока на отдельном длинном хелпере для каждой страницы.
Как лучше, может, вообще по другому?
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
Да, именно ViewHelper.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы