Что происходит в контроллере после получения запроса
Что проверяют
Видите ли вы контроллер как тонкий слой между протоколом и предметной областью и знаете ли, что происходит до него и после. Ответ «принимает запрос и отдаёт ответ» не годится: ждут шагов и границ ответственности.
Как отвечать
Сначала опишите, что было до контроллера: единая точка входа, автозагрузка, ядро приложения, очередь промежуточных обработчиков, маршрутизатор, контейнер зависимостей, который создаёт контроллер и подставляет ему зависимости по типам. Разбор тела и заголовков, сессия, проверка входа, защита от подделки запроса и ограничение частоты обычно уже позади.
Дальше сам метод:
- валидация входных данных отдельным классом запроса или объектом переноса, а не россыпью проверок
isset; - проверка прав на конкретное действие с конкретной сущностью;
- вызов сервиса или обработчика команды, где и живёт бизнес-логика и транзакция;
- превращение результата в ответ: объект ответа, JSON, шаблон или перенаправление, с осмысленным кодом состояния и заголовками.
Отдельно проговорите, чего в контроллере быть не должно: запросов к базе, бизнес-правил, отправки писем, походов во внешние сервисы, печати через echo. Ответ всегда возвращается объектом, потому что он пойдёт обратно через те же промежуточные обработчики. Ошибки бросаются исключениями, а общий обработчик превращает их в страницу или в JSON, единообразно для всего приложения. Долгие операции уходят в очередь.
Где спотыкаются
Описывают контроллер, который делает всё: сам достаёт данные из базы, считает бизнес-правила, шлёт письмо и рисует ответ. Такой метод нельзя переиспользовать из консольной команды и почти невозможно покрыть тестами, поэтому вопрос чаще всего именно про границы.
Второе: печатают ответ напрямую и завершают выполнение. Заголовки уже отправлены, обработчики после контроллера не отработают, а сам метод перестаёт быть проверяемым: тестировать нечего, возвращаемого значения нет.
Третье: путают слои проверки. Права проверяют вручную в каждом методе и однажды забывают, а корректность данных узнают от базы по упавшему запросу. Проверку формата делают до обращения к домену, права выносят в отдельный механизм, а домен защищает свои инварианты сам.