Ответ
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]);
}
Как это работает:
- Symfony видит, что в метод контроллера передается объект сущности (
Post), а не скалярное значение. - ParamConverter перехватывает этот запрос.
- Он берет значение параметра из URL (
slug) и использует репозиторий сущностиPost, чтобы найти запись по указанному полю (по умолчанию ищет поid). - Если сущность не найдена, автоматически выбрасывается исключение
404 Not Found.
Ключевые возможности:
- Кастомные конвертеры: Можно создать свой конвертер, реализовав интерфейс
ParamConverterInterface. - Опции маппинга: Позволяют сопоставить параметр URL с любым полем сущности (как
slugв примере выше). - Валидация: Найденная сущность может быть автоматически провалидирована.
Важно: В современных версиях Symfony (6.1+) часто используют встроенные Argument Resolvers, которые предоставляют похожую функциональность без необходимости в отдельном бандле. Например, Doctrine предоставляет резолвер EntityValueResolver.