Symfony - ID и удобные маршруты - PullRequest
       4

Symfony - ID и удобные маршруты

0 голосов
/ 29 августа 2018

Вариант использования:

  • У меня есть данные, которые имеют как идентификатор, так и МАРШРУТ
  • У меня есть список ссылок и маршрутизатор, которые используют идентификатор, чтобы при изменении заголовка или маршрута ссылки всегда указывали на один и тот же контент.
  • Я бы хотел, чтобы МАРШРУТ отображался в URL-адресе, а не в идентификаторе, когда пользователь заходит на страницу в целях удобства использования и SEO.

В настоящее время я использую редирект для этого и сомневаюсь, что это правильный способ справиться с этим.

public function show($slug)
{
  $list = array(
    // blog data goes in here
  };
  // when we go to the blog post page, we loop through the blog post data
  foreach ($list as $post) {
    // if the slug from our url is equal to the ID
    if ($slug == $post['id']){
      // redirect to the user-friendly route instead
      $route = '/blog/' . $post['route'];
      return $this->redirect($route);
    }
    // if this is the user-friendly, route, then render the page
    if ($slug == $post['route']) {
        $title = $post['title'];
        $content = $post['content'];
    }
  }
  // hello/show.html.twig is the twig template I'm currently using to render single pages
  return $this->render('hello/show.html.twig', [
    'title' => $title,
    'content' => $content,
  ]);
}   

Технически это работает, но я действительно не думаю, что это действительно правильный метод. Есть ли лучший способ использования двух маршрутов для одного и того же представления и предоставления предпочтительного режима для одного маршрута над другим где-то между щелчком по ссылке и отображением страницы?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Просто создайте метод в вашем репозитории с именем 'findOneByIdOrSlug' и постройте запрос, передавая значение, которое приходит из URI, в предложение where с помощью или. Убедитесь, что результат ограничен одним, и обработайте исключения правильно.

Затем вызовите этот метод из контроллера, и это должно сделать.

Невозможно предоставить код, потому что я сейчас на телефоне.

0 голосов
/ 29 августа 2018

Если вы используете Symfony, просто введите ваш маршрут в файле routing.yml. Любое действие контроллера должно иметь один рендер, в настоящее время вы не используете framework.

Подробнее об этом читайте в документе. Вместо перенаправления вы можете вызывать действие внутри действия.

https://symfony.com/doc/current/components/routing.html#load-routes-from-a-file

...