> Что происходит в контроллере после получения запроса (PHP)

Уровень: middle · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: Travelata

Стек: PHP

> Пример ответа

Короткий ответ

После получения запроса контроллер выступает связующим звеном между HTTP-запросом и бизнес-логикой приложения. Он извлекает входные данные, валидирует их, вызывает сервисный слой или репозиторий для выполнения операции, а затем формирует HTTP-ответ. В PHP-фреймворках (Laravel, Symfony) контроллер получает уже готовый объект Request, а возвращает Response, который фреймворк отправляет клиенту.

Подробное объяснение

Жизненный цикл запроса в PHP-приложении выглядит так:

  1. Вход в контроллер - фреймворк сопоставляет URL с маршрутом и вызывает метод контроллера, передавая объект Request (в Laravel - Illuminate\Http\Request, в Symfony - Symfony\Component\HttpFoundation\Request).

  2. Извлечение данных - контроллер получает параметры из запроса: query string, body, headers, route parameters. В PHP это делается через $request->input(), $request->query(), $request->route('id') и т.д.

  3. Валидация - проверка корректности входных данных. В современных фреймворках валидация выносится в Form Request классы или отдельные валидаторы, но на уровне middle-разработчика допустимо и в контроллере.

  4. Вызов бизнес-логики - контроллер не должен содержать сложную логику. Он вызывает сервисный класс, репозиторий или action-класс. Это ключевой принцип: thin controllers, fat services.

  5. Формирование ответа - контроллер возвращает объект Response: JSON, view, redirect или plain text. В Laravel это response()->json(), view(), redirect(). В Symfony - JsonResponse, Response.

  6. Отправка ответа - фреймворк обрабатывает возвращённый Response, отправляет HTTP-статус, headers и body клиенту.

Важно понимать: контроллер - это транспортный слой, он не должен знать про БД, кэш или внешние API напрямую. Его задача - преобразовать HTTP-запрос в вызов сервиса и HTTP-ответ.

На практике

В реальных проектах на PHP контроллеры почти всегда следуют паттерну:

  • Принимают Request через dependency injection.
  • Используют Form Request для валидации (Laravel) или валидаторы (Symfony).
  • Вызывают сервис, который возвращает DTO или результат.
  • Оборачивают результат в Response с правильным HTTP-статусом.
  • Обрабатывают исключения через try-catch или глобальный exception handler.

Типичный пример из Laravel:

PHP
public 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 объекта - в современных фреймворках это работает, но ломает тестируемость.
  • Отсутствие обработки исключений - контроллер должен либо обрабатывать, либо делегировать глобальному обработчику.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью