В Symfony 5.2 мы можем связать Entity с кастомным уникальным параметром, передаваемым в контроллере, используя аннотацию @ParamConverter
и декоратор @Entity
в сочетании с аргументом expr
для настройки запроса.
Для начала определим наш Entity и добавим в него аннотацию @UniqueEntity
для определения уникального параметра. Например, допустим у нас есть следующая Entity Product
:
use DoctrineORMMapping as ORM; use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity; /** * @ORMEntity * @UniqueEntity("slug") */ class Product { // ... }
Здесь мы определяем, что поле slug
должно быть уникальным в базе данных.
Далее, в контроллере, где мы хотим связать Entity с кастомным параметром, добавим аннотацию @ParamConverter
и укажем название Entity класса, а также аргумент expr
, в котором определим условие, включающее наш кастомный параметр. Например, допустим у нас есть контроллер ProductController
:
use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentRoutingAnnotationRoute; use SensioBundleFrameworkExtraBundleConfigurationParamConverter; use AppEntityProduct; class ProductController extends AbstractController { /** * @Route("/product/{customParam}") * @ParamConverter("product", * class="AppEntityProduct", * options={"mapping": {"customParam": "slug"}, "expr": "product.slug = :customParam"} * ) */ public function show(Product $product) { // ... } }
В этом примере мы определяем, что кастомный параметр {customParam}
будет использован для запроса Entity Product
. Мы устанавливаем соответствие между кастомным параметром и полем slug
в Entity и задаем условие product.slug = :customParam
для фильтрации результатов.
Таким образом, при обращении к /product/some-custom-slug
, Symfony автоматически свяжет Entity Product
с соответствующим slug
значением в базе данных и передаст его в метод контроллера show(Product $product)
.
Важно отметить, что для использования @ParamConverter
нужно установить пакет sensio/framework-extra-bundle, либо Symfony Flex должен установить его автоматически, если вы выбрали его при установке Symfony.