Для получения записи по 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
(или в соответствующем файле конфигурации вашего проекта).