2013-03-08 13 views
9

Sto cercando di impostare alcuni itinerari in Symfony2 per il seguente schema:Symfony2 Routing: Due parametri opzionali - almeno una richiesta

www.myaweseomesite.com/payment/customer/{customernumber}/{invoicenumber} 

Entrambi i parametri sono opzionali - così i seguenti scenari devono lavorare:

www.myaweseomesite.com/payment/customer/{customerNumber}/{invoiceNumber} 
www.myaweseomesite.com/payment/customer/{customerNumber} 
www.myaweseomesite.com/payment/customer/{invoiceNumber} 

Ho impostato il mio routing.yml in base allo symfony2 doc.

payment_route: 
pattern: /payment/customer/{customerNumber}/{invoiceNumber} 
defaults: { _controller: PaymentBundle:Index:payment, customerNumber: null, invoiceNumber: null } 
requirements: 
    _method: GET 

Questo funziona fino ad ora. Il problema è che se entrambi i parametri mancano o sono vuoti, il percorso non dovrebbe funzionare. Quindi

www.myaweseomesite.com/payment/customer/ 

non dovrebbe funzionare. C'è un modo per farlo con Symfony2?

+0

Come sono i parametri? Hanno specificità di lunghezza o solo cifre? Solo lettere? Lettere e cifre? Perché se sono entrambi di qualsiasi lunghezza con solo cifre questo è impossibile, dal momento che non puoi sapere quale è quale. –

+0

customerNumber è una cifra, fatturaNumero è una stringa – marty

risposta

16

È possibile definirlo in due percorsi per essere sicuri di avere solo una barra.

payment_route_1: 
    pattern: /payment/customer/{customerNumber}/{invoiceNumber} 
    defaults: { _controller: PaymentBundle:Index:payment, invoiceNumber: null } 
    requirements: 
     customerNumber: \d+ 
     invoiceNumber: \w+ 
     _method: GET 

payment_route_2: 
    pattern: /payment/customer/{invoiceNumber} 
    defaults: { _controller: PaymentBundle:Index:payment, customerNumber: null } 
    requirements: 
     invoiceNumber: \w+ 
     _method: GET 

Si noti che potrebbe essere necessario modificare la regex che definisce i parametri in base alle proprie esigenze. È possibile look at this. Le regex complesse devono essere circondate da ". (Esempio myvar : "[A-Z]{2,20}")

+0

Ok. Sembra strano, ma funziona :) Grazie! – marty

+0

@marty felice di poterti aiutare! Per dare un po 'più di informazioni, il primo percorso corrisponde ai tuoi primi 2 tipi. E il secondo il terzo tipo. (oops Ho dimenticato di rimuovere 'customerNumber: null' dal primo percorso, altrimenti accetterà il percorso senza parametri. Ho aggiornato per riflettere questo!) –

4

di approfondire @Hugo risposta, si riportano di seguito la configurazione con annotazioni:

/** 
* @Route("/public/edit_post/{post_slug}", name="edit_post") 
* @Route("/public/create_post/{root_category_slug}", name="create_post", requirements={"root_category_slug" = "feedback|forum|blog|"}) 
* @ParamConverter("rootCategory", class="AppBundle:Social\PostCategory", options={"mapping" : {"root_category_slug" = "slug"}}) 
* @ParamConverter("post", class="AppBundle:Social\Post", options={"mapping" : {"post_slug" = "slug"}}) 
* @Method({"PUT", "GET"}) 
* @param Request $request 
* @param PostCategory $rootCategory 
* @param Post $post 
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse 
*/ 
public function editPostAction(Request $request, PostCategory $rootCategory = null, Post $post = null) 
{ Your Stuff } 
0

Come da documentazione:

http://symfony.com/doc/current/routing/optional_placeholders.html

impostare un valore predefinito per i parametri facoltativi nelle annotazioni nel controller:

/** 
* @Route("/blog/{page}", defaults={"page" = 1}) 
*/ 
public function indexAction($page) 
{ 
    // ... 
} 

In questo modo è necessario un solo instradamento in routing.yml