2013-03-08 6 views
9

Ich versuche, einige Routen in Symfony2 für das folgende Muster einzurichten:Symfony2 Routing: Zwei optionale Parameter - mindestens eine erforderliche

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

Beide Parameter sind optional - so die folgenden Szenarien arbeiten müssen:

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

Ich habe meine routing.yml nach der symfony2 doc eingerichtet.

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

Dies funktioniert bisher sehr gut. Das Problem ist, dass wenn beide Parameter fehlen oder leer sind, die Route nicht funktionieren sollte. Also

www.myaweseomesite.com/payment/customer/ 

sollte nicht funktionieren. Gibt es eine Möglichkeit, dies mit Symfony2 zu tun?

+0

Wie funktioniert die params aussehen? Haben sie Längenspezifität oder nur Ziffern? Nur Briefe? Buchstaben und Ziffern? Denn wenn sie beide eine beliebige Länge mit nur Ziffern haben, ist das unmöglich, da Sie nicht wissen können, welches was ist. –

+0

customer ist eine Ziffer, InvoiceNumber eine Zeichenfolge ist – marty

Antwort

16

Sie können es in zwei Routen definieren, um sicherzustellen, nur 1 Strich haben.

Bitte beachten Sie, dass Sie die Regex möglicherweise ändern müssen, indem Sie die Parameter entsprechend Ihren genauen Anforderungen definieren. Sie können look at this. Komplexe regex von " umgeben sein haben. (Beispiel myvar : "[A-Z]{2,20}")

+0

Ok. Sieht seltsam aus, aber es funktioniert :) Danke! – marty

+0

@marty froh, ich könnte helfen! Um ein wenig mehr Informationen zu geben, entspricht die erste Route Ihren 2 ersten Typen. Und der zweite der dritte Typ. (Oops vergaß ich entfernt die 'customer: null' von der ersten Route, sonst wird es die Route akzeptieren ohne Parameter Ich habe aktualisiert, um zu reflektieren.!) –

4

Um auf @Hugo Antwort auszuarbeiten, bitte unter der Config mit Anmerkungen zu finden:

/** 
* @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

Per Dokumentation:

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

setzen einen Standardwert für optionale Parameter in den Anmerkungen in der Steuerung:

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

So kann man nur eine Route benötigen in routing.yml