Почему в контроллерах MVC-фреймворков на PHP несколько действий?

В PHP-фреймворках (возможно, это касается фреймворков и на других языках), реализующих шаблон MVC, классы-контроллеры состоят из нескольких методов-действий (action). В большинстве случаев после определения маршрута в контроллере нужно только одно действие, однако класс инициализируется целиком, что тратит дополнительные ресурсы.

В связи с этим возникает вопрос: зачем объединять несколько действий в один класс? Почему бы не сделать все действия одиночными? Единственная причина, которую я сейчас вижу (по крайней мере, в Yii, который я использую), — желание разместить сходные по тематике действия в одном контейнере.
  • Вопрос задан
  • 552 просмотра
Пригласить эксперта
Ответы на вопрос 5
@Giperoglif
разделять action'ы - это экономия на спичках и противоречие инкапсуляции. там у вас помимо этого столько всего инициализируется, что один лишний метод в контроллере - вообще ни о чем.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Обычно это просто удобно, так как в одном контроллере можно разместить действия с одной сущностью, либо объединить их по какому-то другому признаку. Бывает, что несколько экшнов юзают общий приватный метод, который нет смысла выносить в отдельный сервис, и дублировать между файлами не хочется.
В случае вытягивания зависимостей контроллера из контейнера выигрыша от разделения контроллера на экшны нет, от слова "совсем".
Если же зависимости контроллера вставляются через DI - выигрыш будет в том, что не нужно будет пробрасывать зависимости не нужные конкретно в этом экшне, а так же упростится unit тестирование.
Ответ написан
Комментировать
Реальная причина, почему каждый рут выносят в отдельный контроллер - это тестируемость кода. Т.е. если условно класс содержит 5 рутов, для каждого рута требуется какой-то отдельный сервис с логикой, плюс какой-то вспомогательный (эвентДиспатчер итд), то потом все это тестировать очень сложно.

Если зависимостей мало, либо они все идут в один подсервис, то можно запихать все в один класс в разные экшины - почему нет.
Ответ написан
Комментировать
@Vitsliputsli
зачем объединять несколько действий в один класс? Почему бы не сделать все действия одиночными? Единственная причина, которую я сейчас вижу (по крайней мере, в Yii, который я использую), — желание разместить сходные по тематике действия в одном контейнере

Потому что практически все фреймворки используют ООП, а MVC здесь ни при чем. Заменить все методы классами бредовая фантазия, и дело не в более мелком дроблении или сборке схожего вместе, между объектом и методом принципиальная разница. Контроллер такой же объект, его экшены - методы этого объекта. Сколько у объекта методов зависит от его логики, а не от деления данных (может 1, может 10, а может 0).
Ответ написан
Комментировать
anton_reut
@anton_reut
Начинающий веб-разработчик
что тратит дополнительные ресурсы

Ты переживаешь за несколько байт в памяти сервера? Не парься.

зачем объединять несколько действий в один класс?

Что-бы ПОТОМ было интуитивно понятно где нужный экшен искать. Это как полки в библиотеке - быстрее найти книгу по номеру полки чем под каждую индивидуальную книжку делать полочку.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 11:08
5000 руб./за проект
19 апр. 2024, в 10:59
150000 руб./за проект
19 апр. 2024, в 10:02
6000 руб./за проект