Несколько шаблонов в одиночной маршрутизации 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 }
4 ответа

Используете ли вы Symfony2? Если вы используете и можете использовать аннотации для своей маршрутизации вместо yml или xml, тогда возможно иметь несколько маршрутов, определенных по этим строкам:

/**
* @Route("/");
* @Route("/home");
*/

Тогда вам не нужно дублировать метод действия.


Самый простой способ - дублировать блок и сделать 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");
*/


При использовании маршрутов 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


Просто добавьте в ответ Джона:

Я использую его много с 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)
{
 ...
}

licensed under cc by-sa 3.0 with attribution.