Как правильно получить запись по slug?

Для получения записи по slug в Symfony вы можете использовать Doctrine ORM и его функцию findOneBy() вместе с условием "slug".

Вот пример кода, который демонстрирует, как получить запись по slug:

1. Ваша запись (например, сущность Article) должна иметь поле slug:

<?php

namespace AppEntity;

use DoctrineORMMapping as ORM;

/**
 * @ORMEntity(repositoryClass="AppRepositoryArticleRepository")
 */
class Article
{
    // ...

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $slug;

    // ...

    public function getSlug(): ?string
    {
        return $this->slug;
    }
}

2. Затем необходимо создать репозиторий (например, ArticleRepository), который будет содержать метод для поиска записи по slug:

<?php

namespace AppRepository;

use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;

/**
 * @method Article|null find($id, $lockMode = null, $lockVersion = null)
 * @method Article|null findOneBy(array $criteria, array $orderBy = null)
 * @method Article[]    findAll()
 * @method Article[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ArticleRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Article::class);
    }

    public function findBySlug($slug): ?Article
    {
        return $this->findOneBy(['slug' => $slug]);
    }
}

3. Теперь вы можете использовать метод findBySlug() вашего репозитория для получения записи по slug:

<?php

namespace AppController;

use AppEntityArticle;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;

class ArticleController extends AbstractController
{
    /**
     * @Route("/articles/{slug}", name="article_show")
     */
    public function show(ArticleRepository $articleRepository, $slug): Response
    {
        $article = $articleRepository->findBySlug($slug);

        if (!$article) {
            throw $this->createNotFoundException('Article not found');
        }

        return $this->render('article/show.html.twig', [
            'article' => $article,
        ]);
    }
}

Теперь, когда вы посещаете URL-адрес типа /articles/example-slug, Symfony будет использовать ArticleController::show() для отображения записи с соответствующим slug. Если запись не найдена, будет сгенерировано исключение NotFoundException.

Убедитесь, что вы настроили соответствующий маршрут в файле routes.yaml (или в соответствующем файле конфигурации вашего проекта).