Symfony route {id} / + перенаправить или показать правильный слаг, если он отсутствует

В StackOverflow для вопроса вы увидите в URL-адресе что-то вроде этого: https://stackoverflow.com/questions/{question.id}/{question.slug}

Если вы удалите ярлык или измените его, вы будете перенаправлены на URL-адрес, который содержит правильный ярлык, и все это будет сделано, потому что совпадение требуется только для question.id. Я пытаюсь добиться того же в проекте Symfony. Я зашел достаточно далеко, чтобы вводимый (или не учитываемый) слаг никак не влиял на маршрут. Единственное, чего я не добился, так это того, что пользователю отправляется (или отображается) полностью правильный слаг.

Это мой код:

/**
 * @Route("/{id}/{slug}", name = "entity_show", defaults = {"slug" = null})
 */
public function showEntity(Request $request, $id, EntityRepository $entityRepository)
{
   //.....rest of code here

Итак, вкратце, я пришел к выводу, что можно ввести любой слаг или не ввести никакого слага, но перенаправление на слаг, принадлежащий {id}, еще не отображается.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
234
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первоначально вы можете получить объект Question, используя ParamConverter, и в случае неправильного перенаправления на правильный маршрут:

/**
 * @Route("/{id}/{slug}", name = "entity_show", defaults = {"slug" = null})
 */
public function showEntity(Request $request, Question $question, $slug, EntityRepository $entityRepository)
{
       if ($question->getSlug() !== $slug) {
           return $this->redirectToRoute('entity_show', ['id' => $question->getId(), 'slug' => $question->getSlug()]);
       }
       .... 
       do whatever you need

Другие вопросы по теме