#symfony #search #show #routes
#symfony #Поиск #показать #маршруты
Вопрос:
У меня есть настройка веб-приложения с использованием разных категорий с отношением «один ко многим» для публикации.
Это нормально, и я показываю это как category1
, category2
, category3
префикс /{slug} .
Мой вопрос в том, что у меня есть результаты поиска, которые возвращают сообщения из разных категорий, которые используют разные showactions.
Как я могу настроить это так, чтобы после отображения результатов поиска я мог выбирать их, даже если они используют разные showactions? (Без использования универсального маршрута, например /{slug}
, минус начальный префикс типа category .)
например, следующее не будет работать для сообщений в категории 2 или категории 3
<h1><a href="{{ path('acme_demo_category1_show', { slug: post.slug }) }}">{{ post.title }}</a></h1>
showCategory1Action
/**
* @Route("/category1/{slug}", name="acme_demo_category1_show")
* @Template("AcmeDemoBundle:Category:show.html.twig")
*/
public function showCategory1Action($slug)
{
$article = $this->getDoctrine()->getRepository('AcmeDemoBundle:Category1')
->findOneBy(array(
'slug' => $slug
));
if (null === $article) {
throw $this->createNotFoundException('Post was not found');
}
return array(
'article' => $article,
);
Ответ №1:
Обновление (см. Комментарии)
Итак, вам нужны URL-адреса, отражающие категорию сообщения, то есть: football/launch-world-cup.html Для этого вам необходимо иметь свойство slug для объекта Post, а также для объекта Category.
Ваша маршрутизация должна выглядеть примерно так
acme_demo_show:
pattern: /{catslug}/{postslug}.html
defaults: { _controller: AcmeDemoBundle:Default:show }
showAction
Затем метод вашего контроллера будет принимать 2 параметра, и в twig вы можете использовать
<h1><a href="{{ path('acme_demo_show' , { catslug: post.category.slug, postslug: post.slug }) }}">{{ post.title }}</a></h1>
Сообщение о запуске slug world-cup, опубликованное в категории, содержащей slug football, приведет к www.mywebsite.com/football/world-cup-launch.html
Комментарии:
1. Итак, какой будет наилучшая практика? Использовать универсальный маршрут показа, который работает для всего? Я видел некоторые сайты, которые используют разные префиксы перед slug и хотели сделать что-то подобное.
2. Да. Эти веб-сайты используют два слизней, один для категории (т.е.: «новости»), один для сообщения (т.е.: the-post-title.html ). Что дало бы {{ path(‘acme_demo_show’, { postslug: post.slug, catslug: post.category . slug }) }} и в конечном итоге как /news/the-post-title.html . Если вам не нужны конкретные контроллеры для каждой категории, это правильный путь.
3. Я вижу, можете ли вы обновить свой ответ с помощью примера настройки, и я приму его. Итак, мне нужно будет добавить новое свойство в объект категории под названием category slug?
4. Возможно, вы также захотите взглянуть на расширение doctrine sluggable. это отличный способ генерировать slug из заголовка сообщения.
5. Вы имеете в виду тот, который из пакета stof?