Какому из стандартов PSR не следует Symfony?

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

Ответ

Symfony не реализует PSR-7 (HTTP Message Interfaces) нативно в своем ядре. Вместо этого он использует собственный, более ранний и функционально богатый компонент HttpFoundation.

Почему Symfony выбрал этот путь:

  1. Исторические причины: Компонент HttpFoundation был создан и стабилизирован задолго до принятия PSR-7. Переписать весь фреймворк и экосистему бандлов под новый стандарт был бы крайне затратным.
  2. Различия в философии: PSR-7 требует, чтобы объекты запроса и ответа были иммутабельными (неизменяемыми). Это хорошо для middleware-архитектуры, но может быть менее удобно и немного медленнее для традиционного MVC, где объекты запроса часто модифицируются (например, добавляются атрибуты). Объекты Symfony Request и Responseмутабельны.
  3. Удобство API: HttpFoundation предоставляет множество удобных методов "из коробки" для работы с сессиями, файлами, локалями, которые в PSR-7 потребовали бы дополнительных библиотек.

Пример работы с Symfony Request:

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationJsonResponse;

// Request создается из глобальных переменных
$request = Request::createFromGlobals();

// Удобный доступ к данным
$id = $request->query->get('id'); // GET-параметр
$content = $request->request->get('name'); // POST-параметр
$file = $request->files->get('avatar'); // Загруженный файл
$header = $request->headers->get('Authorization');

// Мутабельность: можно добавить атрибут для передачи данных во внутренние слои
$request->attributes->set('_controller', 'AppControllerApiController::show');

// Ответ также прост
$response = new JsonResponse(['status' => 'success', 'id' => $id]);
$response->setStatusCode(201);
$response->headers->set('Cache-Control', 'no-cache');

Совместимость с PSR-7: Несмотря на это, Symfony обеспечивает полную совместимость через отдельные компоненты. Если вам нужно работать с библиотекой, требующей PSR-7 (например, многие PSR-15 middleware), вы можете использовать:

  • symfony/psr-http-message-bridge: Конвертирует объекты HttpFoundation в PSR-7 и обратно.
  • nyholm/psr7: Легковесная и быстрая реализация PSR-7, рекомендованная для использования с Symfony.

Таким образом, вы можете разрабатывать приложение на привычном HttpFoundation, а на уровне контроллера или при интеграции с внешними компонентами легко конвертировать запросы и ответы.