Что такое контроллер в паттерне MVC?

«Что такое контроллер в паттерне MVC?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Контроллер в архитектурном паттерне Model-View-Controller (MVC) — это компонент, который обрабатывает входящие запросы (обычно HTTP), координирует взаимодействие между Моделью (данные и бизнес-логика) и Представлением (пользовательский интерфейс). Его основная задача — принять входные данные, вызвать соответствующие операции в Модели и определить, какое Представление использовать для формирования ответа.

Роль и ответственность контроллера:

  • Маршрутизация: Определяет, какой метод контроллера должен выполниться для данного URL и HTTP-метода.
  • Валидация: Проверяет корректность входных данных (параметры запроса, тело, файлы).
  • Оркестрация: Вызывает сервисы, репозитории или другие компоненты бизнес-логики (Модель).
  • Управление состоянием: Часто работает с сессиями, аутентификацией и авторизацией.
  • Выбор ответа: Решает, отрендерить ли HTML-шаблон, вернуть JSON, выполнить редирект или отдать ошибку.

Пример «тощего» контроллера в Laravel:

// UserController.php
namespace AppHttpControllers;

use AppHttpControllersController;
use AppServicesUserService; // Бизнес-логика вынесена в сервис
use IlluminateHttpRequest;

class UserController extends Controller
{
    protected $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    // Обработка GET-запроса для страницы профиля
    public function showProfile(Request $request, $userId)
    {
        // 1. Валидация (может быть вынесена в Form Request)
        $request->validate(['userId' => 'required|integer']);

        // 2. Вызов сервиса (Модель/бизнес-логика)
        $userProfile = $this->userService->getUserProfile($userId);

        // 3. Возврат Представления с данными
        return view('user.profile', ['profile' => $userProfile]);
    }
}

Важно: Современные best practices рекомендуют делать контроллеры максимально «тощими». Сложная бизнес-логика должна находиться в отдельных сервисных классах, слоях Domain или Application, что делает код более тестируемым и поддерживаемым.