2012-04-10 20 views
7

Quiero que todas las URL en mi aplicación tengan una barra inclinada. Tengo la siguiente ruta en mi route.yml:Symfony2: URLs con barra diagonal y un parámetro opcional

foo_route: 
    pattern: /foo/{page}/ 
    defaults: { _controller: FooBundle:Foo:list, page: 1 } 
    requirements: 
     page: \d+ 

solicitudes a '/ foo/1 /' funcionan bien, sin embargo pide a '/ foo /' no coinciden debido a la barra final en el patrón de URL .

¿Cómo puedo definir rutas con barras diagonales y un parámetro opcional? Soy consciente de que puedo definir 2 rutas diferentes para los dos casos, pero quiero evitar eso.

+0

¿Cuál es tan malo sobre haveing ​​otra ruta? – Gigala

Respuesta

1

Quizás sea más fácil definir el Controlador sobre una anotación.

en route.yml:

MineTestBundle: 
    resource: "@MineTestBundle/Controller/" 
    type:  annotation 

A continuación, se puede definir la ruta directa en su controlador.

/** 
* @Route("/foo") 
*/ 
class FooController extends Controller { 
    /** 
    * @Route("/", name="_foo_index") 
    * @Template() 
    */ 
    public function indexAction() { 
     return array(); 
    } 

    /** 
    * @Route("/{page}/", name="_foo_page") 
    * @Template() 
    */ 
    public function pageAction($page) { 
     return array('page' => $page); 
    } 
} 

Ahora, cuando se intenta acceder a /foo se llega a la indexAction y cuando accede a /foo/1/ se llega a la pageaction.

Editar:

Lo siento por el malentendido. He intentado reproducir tu problema. La forma más fácil es definir 2 Rutas en su configuración como esta:

foo_route: 
    pattern: /foo/{page}/ 
    defaults: { _controller: AcmeDemoBundle:Foo:list } 
    requirements: 
     name: ".+" 

foo_route_foo: 
    pattern: /foo 
    defaults: { _controller: AcmeDemoBundle:Foo:list, page: 1 } 
    requirements: 
     name: ".+" 

En la ruta sin el parámetro {página} Puede establecer el valor predeterminado de la página 1 .

Pero aquí en el libro de cocina es un capítulo How to allow a "/" character in a route parameter por lo que su posible permitir un / en la ruta así que todo lo que viene después de /foo/123/234/ está en la variable $page y se puede dividir por sí mismo en su función.

+0

Gracias por su comentario, pero de hecho solo hay una acción con una página de parámetros opcional. – Gerry

+0

páginaAcción;) existe el parámetro. Es lo mismo que su ejemplo, pero tiene una indexAction predeterminada cuando deja en blanco el parámetro. – Stony

+0

No, has entendido mal. Quiero una ruta (con el parámetro opcional), que apunta a una sola acción. Definitivamente quiero evitar crear dos rutas y/o dos acciones. – Gerry

6

En un caso separado pero relacionado, puede hacer coincidir los tres modelos siguientes:

/foo 
/foo/ 
/foo/page/1 

al eliminar la barra invertida en la ruta y relajando la expresión regular para que coincida con 0 o más caracteres (*), en vez de 1 o más (+):

foo_route: 
    pattern: /foo/{page} 
    defaults: { _controller: FooBundle:Foo:list, page: 1 } 
    requirements: 
     page: \d* 

sin embargo, eso no coincidirá/foo/página/1/

Cuestiones relacionadas