Несколько шаблонов в одиночной маршрутизации symfony
Как сделать несколько шаблонов в одной маршрутизации Symfony?
Обычно мы имеем маршрутизацию как
blog:
pattern: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Возможно ли иметь два шаблона маршрутизации?
Что-то вроде
blog:
#Below pattern to match with '/' or '/index'
pattern: {/ , /index}
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Ответы
Ответ 1
Используете ли вы Symfony2? Если вы используете и можете использовать аннотации для своей маршрутизации вместо yml или xml, тогда возможно иметь несколько маршрутов, определенных по этим строкам:
/**
* @Route("/");
* @Route("/home");
*/
Тогда вам не нужно дублировать метод действия.
Ответ 2
Самый простой способ - дублировать блок и сделать 2 маршрута.
blog:
pattern: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
blog_index:
pattern: /index
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Таким образом, у вас есть возможность использовать оба из них в своем пути, если вам это нужно.
Здесь вы можете увидеть другое сообщение о том, как использовать регулярное выражение в вашей маршрутизации. Возможно, вы можете написать простое регулярное выражение, которое проверяет, установлен ли index.
Edit:
Если вы работаете с аннотациями, что я предпочитаю, вы можете написать более одного маршрута над своим классом примерно так:
/**
* @Route("/");
* @Route("/home");
*/
Ответ 3
При использовании маршрутов YAML вы также можете использовать node anchors синтаксис выражения для ссылки на существующее определение маршрута.
&
указывает первое вхождение якоря, *
указывает привязку к ссылке, <<
сообщает Symfony yaml parser для объединения указанного node.
blog: &blog
path: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
blog_index:
<<: *blog
path: /index
blog_page:
<<: *blog
path: /blog
В качестве альтернативы вы можете использовать привязки в значение атрибута маршрута.
blog:
path: /
defaults: &blog_defaults
_controller: AcmeBlogBundle:Blog:index
page: 1
blog_index:
path: /index
defaults: *blog_defaults
blog_page:
path: /blog
defaults: *blog_defaults
Однако для предотвращения плохого SEO из-за дублирования контента рекомендуется использовать redirect.
blog:
path: /
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
blog_index:
path: /index
defaults: &blog_redirect
_controller: FrameworkBundle:Redirect:redirect
route: blog
permanent: true
blog_page:
path: /blog
defaults: *blog_redirect
Ответ 4
Просто добавьте в ответ Джона:
Я использую его много с FOSJsRoutingBundle:
/**
* @Route("/", name="route_name_1", options={"expose"=true})
* @Route("/{id}", name="route_name_2", options={"expose"=true})
* @Method("GET")
* @Template()
*/
Таким образом, у меня есть один метод и два маршрута.
Не забудьте установить значение по умолчанию $id:
public function indexAction($id = null)
{
...
}