Как в Symfony 5.2 связать Entity с кастомномым уникальному параметром передаваемым в контроллере?

В 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.