> Что происходит в контроллере после получения запроса (PHP)
Уровень: middle · Роль: backend · Язык: PHP · Категория: Технические вопросы
Компании: Travelata
Стек: PHP
> Пример ответа
Короткий ответ
После получения запроса контроллер выступает связующим звеном между HTTP-запросом и бизнес-логикой приложения. Он извлекает входные данные, валидирует их, вызывает сервисный слой или репозиторий для выполнения операции, а затем формирует HTTP-ответ. В PHP-фреймворках (Laravel, Symfony) контроллер получает уже готовый объект Request, а возвращает Response, который фреймворк отправляет клиенту.
Подробное объяснение
Жизненный цикл запроса в PHP-приложении выглядит так:
-
Вход в контроллер - фреймворк сопоставляет URL с маршрутом и вызывает метод контроллера, передавая объект Request (в Laravel -
Illuminate\Http\Request, в Symfony -Symfony\Component\HttpFoundation\Request). -
Извлечение данных - контроллер получает параметры из запроса: query string, body, headers, route parameters. В PHP это делается через
$request->input(),$request->query(),$request->route('id')и т.д. -
Валидация - проверка корректности входных данных. В современных фреймворках валидация выносится в Form Request классы или отдельные валидаторы, но на уровне middle-разработчика допустимо и в контроллере.
-
Вызов бизнес-логики - контроллер не должен содержать сложную логику. Он вызывает сервисный класс, репозиторий или action-класс. Это ключевой принцип: thin controllers, fat services.
-
Формирование ответа - контроллер возвращает объект Response: JSON, view, redirect или plain text. В Laravel это
response()->json(),view(),redirect(). В Symfony -JsonResponse,Response. -
Отправка ответа - фреймворк обрабатывает возвращённый Response, отправляет HTTP-статус, headers и body клиенту.
Важно понимать: контроллер - это транспортный слой, он не должен знать про БД, кэш или внешние API напрямую. Его задача - преобразовать HTTP-запрос в вызов сервиса и HTTP-ответ.
На практике
В реальных проектах на PHP контроллеры почти всегда следуют паттерну:
- Принимают Request через dependency injection.
- Используют Form Request для валидации (Laravel) или валидаторы (Symfony).
- Вызывают сервис, который возвращает DTO или результат.
- Оборачивают результат в Response с правильным HTTP-статусом.
- Обрабатывают исключения через try-catch или глобальный exception handler.
Типичный пример из Laravel:
PHPpublic function store(StoreUserRequest $request, UserService $service){$user = $service->create($request->validated());return response()->json($user, 201);}
Здесь контроллер не знает, как создаётся пользователь - это ответственность сервиса. Контроллер лишь передаёт валидированные данные и возвращает JSON с кодом 201.
Пример кода
PHP// Laravel контроллерclass UserController extends Controller{public function __construct(private UserService $userService) {}public function show(Request $request, int $id): JsonResponse{try {$user = $this->userService->getUserById($id);return response()->json($user);} catch (UserNotFoundException $e) {return response()->json(['error' => $e->getMessage()], 404);}}public function store(StoreUserRequest $request): JsonResponse{$user = $this->userService->createUser($request->validated());return response()->json($user, 201);}}// Symfony контроллерclass UserController extends AbstractController{public function show(int $id, UserService $userService): JsonResponse{try {$user = $userService->getUserById($id);return $this->json($user);} catch (UserNotFoundException $e) {return $this->json(['error' => $e->getMessage()], 404);}}}
Как отвечать на собеседовании
Начните с общей картины: контроллер - это точка входа в приложение после маршрутизации. Затем опишите последовательность действий: получение данных, валидация, вызов сервиса, формирование ответа. Подчеркните, что контроллер не должен содержать бизнес-логику - это антипаттерн. Упомяните, что в современных PHP-фреймворках контроллеры тонкие, а вся логика вынесена в сервисы. Если спросят про конкретный фреймворк - приведите пример с Laravel или Symfony, покажите знание Request/Response объектов. Также стоит упомянуть обработку исключений и HTTP-статусы.
Что проверяет интервьюер
Интервьюер оценивает:
- Понимание MVC и места контроллера в нём.
- Знание жизненного цикла HTTP-запроса в PHP-фреймворке.
- Умение разделять ответственность: контроллер vs сервис vs репозиторий.
- Знание объектов Request и Response.
- Понимание валидации и обработки ошибок.
- Способность объяснить, почему контроллер должен быть тонким.
Если кандидат начинает описывать SQL-запросы или работу с БД внутри контроллера - это красный флаг. Ожидается, что middle-разработчик чётко понимает границы ответственности.
Типичные ошибки
- Размещение бизнес-логики прямо в контроллере - самый частый антипаттерн.
- Отсутствие валидации или валидация вручную через
$_POSTвместо Request объекта. - Игнорирование HTTP-статусов: всегда возвращать 200, даже при ошибках.
- Прямая работа с БД через
DB::query()в контроллере. - Непонимание разницы между
Requestи$_GET/$_POST. - Возврат строки вместо Response объекта - в современных фреймворках это работает, но ломает тестируемость.
- Отсутствие обработки исключений - контроллер должен либо обрабатывать, либо делегировать глобальному обработчику.
> Похожие задачи по PHP
Что происходит при несовпадении типов и как происходит проверка типов в PHP
Расскажите про типизацию в PHP
Что такое принцип подстановки Лисков из SOLID?
С какими эволюционными базами данных ты работал
> Похожие задачи по backend
Что происходит при несовпадении типов и как происходит проверка типов в PHP
Расскажите про типизацию в PHP
С какими эволюционными базами данных ты работал
Какие тесты ты пишешь: функциональные или юнит тесты?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью