Что такое ParamConverter в Symfony и как он работает?

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

Ответ

ParamConverter — это функциональность бандла sensio/framework-extra-bundle в Symfony, которая автоматически конвертирует параметры маршрута (например, {id}) в объекты сущностей Doctrine. Это избавляет от ручного написания кода для поиска сущности в репозитории внутри контроллера.

Пример использования с атрибутами (Symfony 5.4+):

use AppEntityPost;
use SensioBundleFrameworkExtraBundleConfigurationParamConverter;

#[Route('/blog/{slug}', name: 'post_show')]
public function show(
    #[ParamConverter('post', class: Post::class, options: ['mapping' => ['slug' => 'slug']])]
    Post $post
): Response {
    // Переменная $post уже содержит объект сущности Post,
    // найденный по полю `slug` из URL.
    return $this->render('post/show.html.twig', ['post' => $post]);
}

Как это работает:

  1. Symfony видит, что в метод контроллера передается объект сущности (Post), а не скалярное значение.
  2. ParamConverter перехватывает этот запрос.
  3. Он берет значение параметра из URL (slug) и использует репозиторий сущности Post, чтобы найти запись по указанному полю (по умолчанию ищет по id).
  4. Если сущность не найдена, автоматически выбрасывается исключение 404 Not Found.

Ключевые возможности:

  • Кастомные конвертеры: Можно создать свой конвертер, реализовав интерфейс ParamConverterInterface.
  • Опции маппинга: Позволяют сопоставить параметр URL с любым полем сущности (как slug в примере выше).
  • Валидация: Найденная сущность может быть автоматически провалидирована.

Важно: В современных версиях Symfony (6.1+) часто используют встроенные Argument Resolvers, которые предоставляют похожую функциональность без необходимости в отдельном бандле. Например, Doctrine предоставляет резолвер EntityValueResolver.