Ответ
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.
Ответ 18+ 🔞
Э, слушай, вот есть такая штука в Symfony — ParamConverter. Это из бандла sensio/framework-extra-bundle. Представь, ты пишешь контроллер, и тебе нужно по id из урла найти запись в базе. Обычно ты бы писал этот ебучий boilerplate-код: получил id, пошел в репозиторий, find($id), проверил на null, если нет — вернул 404. Скука смертная, да? Так вот, ParamConverter делает это за тебя автоматом, ядрёна вошь!
Смотри, как это выглядит с атрибутами (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, а не какую-то строкуslug". - ParamConverter перехватывает этот пиздец и говорит: "Расслабься, братан, я всё улажу".
- Он берет значение из урла (тот самый
slug), лезет в репозиторий сущностиPostи ищет запись по указанному полю. По умолчанию, конечно, искал бы поid, но мы-то умные, указали маппинг. - Если сущность не нашел — всё, приехали. Автоматом выкидывается
404 Not Found. Никаких лишних проверок, красота!
Что ещё он умеет, этот хитрожопый инструмент:
- Свои конвертеры: Если стандартный тебе не подходит, можешь написать свой, реализовав
ParamConverterInterface. Полная свобода, делай что хочешь. - Гибкий маппинг: Можешь сопоставить параметр из урла с любым полем сущности, не только с
id. Как в примере выше —slugсslug. - Валидация на бис: Найденную сущность можно сразу на валидацию запихнуть, чтобы два раза не вставать.
Но есть один важный момент, ёпта: В свежих версиях Symfony (6.1+) часто используют встроенные Argument Resolvers. Это типа такая же фича, но уже из коробки, без лишнего бандла. Например, Doctrine свой резолвер предоставляет — EntityValueResolver. Так что смотри по версии своего проекта, чтобы не оказаться, как тот самый Фарлаф, на объебке проехать.