Почему в контроллерах MVC-фреймворков на PHP несколько действий?
В PHP-фреймворках (возможно, это касается фреймворков и на других языках), реализующих шаблон MVC, классы-контроллеры состоят из нескольких методов-действий (action). В большинстве случаев после определения маршрута в контроллере нужно только одно действие, однако класс инициализируется целиком, что тратит дополнительные ресурсы.
В связи с этим возникает вопрос: зачем объединять несколько действий в один класс? Почему бы не сделать все действия одиночными? Единственная причина, которую я сейчас вижу (по крайней мере, в Yii, который я использую), — желание разместить сходные по тематике действия в одном контейнере.
неправильное у Вас представление о тяжести операций для сервера.
Самые тяжелые - это работа с файлами.
Считать по 100 байт из 10 файлов для сервера тяжелее чем если они были в составе одного на несколько мегабайт файла. Тут начиная с опкод кеширование до кешей чтения файловой системы в озу.
разделять action'ы - это экономия на спичках и противоречие инкапсуляции. там у вас помимо этого столько всего инициализируется, что один лишний метод в контроллере - вообще ни о чем.
Обычно это просто удобно, так как в одном контроллере можно разместить действия с одной сущностью, либо объединить их по какому-то другому признаку. Бывает, что несколько экшнов юзают общий приватный метод, который нет смысла выносить в отдельный сервис, и дублировать между файлами не хочется.
В случае вытягивания зависимостей контроллера из контейнера выигрыша от разделения контроллера на экшны нет, от слова "совсем".
Если же зависимости контроллера вставляются через DI - выигрыш будет в том, что не нужно будет пробрасывать зависимости не нужные конкретно в этом экшне, а так же упростится unit тестирование.
Реальная причина, почему каждый рут выносят в отдельный контроллер - это тестируемость кода. Т.е. если условно класс содержит 5 рутов, для каждого рута требуется какой-то отдельный сервис с логикой, плюс какой-то вспомогательный (эвентДиспатчер итд), то потом все это тестировать очень сложно.
Если зависимостей мало, либо они все идут в один подсервис, то можно запихать все в один класс в разные экшины - почему нет.
зачем объединять несколько действий в один класс? Почему бы не сделать все действия одиночными? Единственная причина, которую я сейчас вижу (по крайней мере, в Yii, который я использую), — желание разместить сходные по тематике действия в одном контейнере
Потому что практически все фреймворки используют ООП, а MVC здесь ни при чем. Заменить все методы классами бредовая фантазия, и дело не в более мелком дроблении или сборке схожего вместе, между объектом и методом принципиальная разница. Контроллер такой же объект, его экшены - методы этого объекта. Сколько у объекта методов зависит от его логики, а не от деления данных (может 1, может 10, а может 0).
Ты переживаешь за несколько байт в памяти сервера? Не парься.
зачем объединять несколько действий в один класс?
Что-бы ПОТОМ было интуитивно понятно где нужный экшен искать. Это как полки в библиотеке - быстрее найти книгу по номеру полки чем под каждую индивидуальную книжку делать полочку.