Сколько действий на контроллер в MVC

Я знаю, что название вопроса расплывчато, но я не мог придумать ничего более чистого. (И хотя это может показаться вопросом ZF, на самом деле это просто вопрос php MVC.)

Недавно я перенес проект с ZF2 на ZF3. Основным отличием была необходимость внедрения зависимостей в каждую модель и контроллер. Поскольку теперь я ввел все зависимости вместо того, чтобы вызывать их с помощью serviceLocator (который лениво загружает службу), у меня возникла пара вопросов.

Несколько контроллеров теперь кажутся действительно раздутыми и создают экземпляры служб, которыми они не будут пользоваться. Просто потому, что другому действию нужна служба, теперь весь контроллер создает экземпляр службы. Несмотря на то, что создание экземпляра службы не так сильно требует производительности, это все равно кажется пустой тратой.

У меня вопрос, и это в основном мой вопрос с тех пор, как я начал работать с MVC, насколько конкретно вы бы сделали контроллер? Сколько действий на контроллер? Или, может быть, в данном случае: сколько сервисов на контроллер?

Я сейчас даже подумываю разделить каждый контроллер, чтобы у всех действий был свой контроллер. Это хорошая / плохая идея?

Есть предположения?

Контроллер - это такой же класс, как и любой другой. В более общем смысле, всякий раз, когда вы обнаруживаете, что думаете, что «этот класс действительно большой и делает много разных вещей», вы, вероятно, захотите реорганизовать его на более мелкие компоненты.

David 08.11.2018 15:15

Одно диспетчерское действие для каждого контроллера является разумным, но если вас беспокоят накладные расходы на загрузку сервисов, вы можете захотеть загрузить их лениво: docs.zendframework.com/zend-servicemanager/lazy-services

avy 08.11.2018 16:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
452
1

Ответы 1

Я лично придерживаюсь того, чтобы Контроллер был сосредоточен на одном действии. Но он должен иметь возможность делать / вызывать все необходимое для завершения действия.

Например, у вас есть сущность продукта. Для базового CRUD (я использую iCRUD, почему бы и нет?: P) я бы создал 5 контроллеров: Index, Add, View, Edit, Delete (семантика, независимо от того, используете ли вы Add / Create, View / Read и т. д.).

Самый большой из них - Edit, который должен «получить» существующий продукт, загрузить его в форму и вернуть его только для настройки страницы редактирования. При POST данных ему нужно будет получить существующий Продукт, загрузить его в форму, получить данные запроса и загрузить их в форму, проверить, подготовить к хранению, сохранить и вернуть ответ.

Но я предпочитаю, чтобы он мог делать все, но сосредоточился на этом действии.

Конечно, вы можете иметь все (i) действия CRUD в одном контроллере и при этом правильно применять MVC. Лично я считаю более чистым разделить их. В любом случае из пространства имен вы сможете определить, для какого класса вы смотрите.

Пример из проекта ниже:

На мой взгляд, ясно, что здесь мы смотрим на модуль User, подпространство имен Controller, сфокусированное на объекте User. (В этом модуле есть родственники объекта User: Route, Role и т. д.)


Надо сказать, у него есть как плюсы, так и минусы.

Плюсы:

  • Чисто и ясно, где вам нужно быть для чего-то
  • Разделение проблем
  • Довольно СУХОЙ (Не повторяйся)
  • Простые в повторном использовании контроллеры действий для разных предметов (например, создать более абстрактный ViewController и реализовать для каждой темы: продукт, пользователь, адрес и т. д.)

Минусы:

  • Достаточно СУХОЙ (не повторяйтесь) (посмотрите, что я там сделал? Это нужно делать с предварительной загрузкой форм и т. д.)
  • Дополнительная конфигурация в таких фреймворках, как Zend Framework 3 (дополнительные комбинации Контроллер / Завод для регистрации)
  • Настройка занимает больше времени, рефакторинг - это «больше»

Другие вопросы по теме