Задать вопрос

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

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

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

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

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

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

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽