В 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}
, еще не отображается.
Первоначально вы можете получить объект 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