2012-07-06 5 views
15

¿Cómo hacer un patrón múltiple en el enrutamiento simple de Symfony?Patrón múltiple en el enrutamiento de Symfony simple

Normalmente tenemos un enrutamiento como

blog: 
    pattern: /
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

¿Es posible tener dos patrones de enrutamiento?

Algo así como

blog: 
    #Below pattern to match with '/' or '/index'  
    pattern: {/ , /index} 
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

Respuesta

21

¿Está utilizando Symfony2? Si usted y puede utilizar las anotaciones para su enrutamiento en lugar de yml o xml, entonces es posible tener múltiples rutas definidas a lo largo de estas líneas:

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

, entonces no es necesario duplicar el método de acción.

+0

es 2017: ¿hay alguna forma de Symfony3 de hacer esto con routing.yaml? –

20

La forma más fácil es Dublicate el bloque y hacer 2 rutas.

blog: 
    pattern: /
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

blog_index: 
    pattern: /index 
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

Así que tiene la posibilidad de utilizar ambos en su camino si lo necesita.

Here puedes ver otra publicación sobre cómo usar la expresión regular en tu enrutamiento. Tal vez pueda escribir una expresión regular simple que compruebe si se ha configurado índice.

Editar:

Si trabaja con anotaciones lo que prefiero entonces se puede escribir más de una ruta sobre la clase algo como esto:

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

¿Funciona con diferentes parámetros? Si es así, ¿cómo? –

1

sólo para añadir a la respuesta de Juan:

lo uso mucho con FOSJsRoutingBundle:

/** 
* @Route("/", name="route_name_1", options={"expose"=true}) 
* @Route("/{id}", name="route_name_2", options={"expose"=true}) 
* @Method("GET") 
* @Template() 
*/ 

De esta manera tengo un método y dos rutas.

Sólo recuerde para fijar el valor por defecto $ id:

public function indexAction($id = null) 
{ 
    ... 
} 
7

Al utilizar rutas YAML también puede utilizar la sintaxis node anchors expresión para hacer referencia a una definición de la ruta existente.

& especifica la primera ocurrencia de un ancla, * especifica el ancla a la referencia, << cuenta la Symfony yaml parser para fusionar el nodo especificado.

blog: &blog 
    path:/
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

blog_index: 
    <<: *blog 
    path: /index 

blog_page: 
    <<: *blog 
    path: /blog 

Alternativamente, puede utilizar anclas en un route attribute value.

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 

Sin embargo, para evitar una mala SEO debido a la duplicación de contenido, se recomienda utilizar un redirect lugar.

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 
Cuestiones relacionadas