2012-04-10 11 views
7

Voglio che tutti gli URL nella mia applicazione abbiano una barra finale. Ho il seguente percorso nella mia route.yml:Symfony2: URL con barra finale e parametro opzionale

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

richieste a '/ foo/1 /' lavoro bene, tuttavia le richieste al '/ foo /' non sono abbinati a causa della barra finale nel pattern URL .

Come definire i percorsi con barre finali e un parametro facoltativo? Sono consapevole di poter definire 2 percorsi diversi per i due casi, ma voglio evitarlo.

+0

che cosa è così male per haveing ​​un'altra strada? – Gigala

risposta

1

Forse è più semplice definire il controller su un'annotazione.

in route.yml:

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

Quindi è possibile definire il percorso diretto nel controller.

/** 
* @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); 
    } 
} 

Ora, quando si tenta di accedere /foo si arriva alla indexAction e quando si accede /foo/1/ venite al pageAction.

Edit:

Ci scusiamo per il malinteso. Ho provato a riprodurre il tuo problema. Il modo più semplice è quello di definire 2 percorsi nella configurazione in questo modo:

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: ".+" 

nel percorso senza il parametro {page} È possibile impostare il valore predefinito pagina .

Ma qui, nel libro di cucina è un capitolo How to allow a "/" character in a route parameter per cui il suo possibile per consentire un / nel percorso in modo tutto ciò che viene dopo è /foo/123/234/ nella variabile $page e li si può dividere per se stessi nella funzione.

+0

Grazie per il tuo commento, ma in effetti c'è solo un'azione con una pagina dei parametri opzionale. – Gerry

+0

pageAction;) c'è il parametro. È lo stesso del tuo esempio ma hai un indice index predefinito quando lasci il parametro vuoto. – Stony

+0

No, hai frainteso. Voglio una rotta (con il parametro opzionale), che punta a una singola azione. Voglio assolutamente evitare di creare due percorsi e/o due azioni. – Gerry

6

In un caso separato ma correlato, è possibile abbinare i seguenti tre modelli:

/foo 
/foo/ 
/foo/page/1 

eliminando la barra rovesciata finale nel percorso e rilassante l'espressione regolare per corrispondere 0 o più caratteri (*), invece di 1 o più (+):

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

tuttavia che non corrisponderanno/foo/page/1/