Работали ли вы с классами Request в PHP-фреймворках?

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

Ответ

Да, активно. В фреймворках объект Request — это абстракция над HTTP-запросом, которая предоставляет безопасный и удобный доступ к данным.

В Laravel это делается через dependency injection:

use IlluminateHttpRequest;

public function updateProfile(Request $request) {
    // Валидация данных запроса
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email',
        'avatar' => 'nullable|image|max:2048'
    ]);

    // Получение данных
    $name = $request->input('name'); // или $validated['name']
    $allInput = $request->all();
    $hasFile = $request->hasFile('avatar');

    // Работа с файлами
    if ($request->hasFile('avatar')) {
        $path = $request->file('avatar')->store('avatars', 'public');
    }

    // Определение типа запроса
    if ($request->isMethod('post')) { /* ... */ }
    if ($request->ajax()) { /* ... */ }
    if ($request->wantsJson()) { /* ... */ }
}

В Symfony подход похожий, но с другим API:

use SymfonyComponentHttpFoundationRequest;

public function index(Request $request) {
    $page = $request->query->getInt('page', 1); // GET-параметр с приведением к int
    $content = json_decode($request->getContent(), true); // Для JSON-тела запроса
    $locale = $request->getLocale(); // Работа с локализацией
}

Преимущества использования объекта Request перед суперглобальными массивами ($_GET, $_POST):

  1. Безопасность: Данные автоматически экранируются, есть методы для безопасного извлечения.
  2. Тестируемость: Можно легко создать мок-объект запроса с нужными данными для юнит-тестов.
  3. Единый интерфейс: Упрощает работу с данными, независимо от метода (GET, POST, PUT, JSON).
  4. Дополнительная функциональность: Удобные методы для работы с сессиями, куками, заголовками, определением IP-адреса клиента и т.д.