2013-06-12 12 views
5

w mojej aplikacji Symfony2 Chciałbym zrobić cztery adresy możliwe z jednej trasy:Routing w Symfony2: opcjonalny parametr pl czterech adresów URL dla jednej trasy

  1. a-lot-of-drugiej-stuff/raport/- 20 (liczba ujemna)
  2. a-lot-of-other-stuff/raport/40 (liczba dodatnia)
  3. a-lot-of-drugiej-stuff/raport/(bez numeru)
  4. a-lot- z-innego-stuff/zgłosić (bez numeru i nie /)

Moja trasa aktualnie wygląda tak:

report: 
    pattern: /report/{days} 
    defaults: { _controller: "AppReportBundle:Report:dayReport", days = null } 

Akcja jest zdefiniowany jako:

ten obecnie powoduje, że adres URL 1 i 2 działa, ale w przypadku adresu URL 3 i 4 pojawia się błąd:

Nie znaleziono trasy

Jak ustawić parametr "dni" jako opcjonalny?
A jeśli parametr nie jest podany, w jaki sposób mogę zezwolić na pominięcie /?

+0

To bardzo dziwny. Ponieważ 4. trasa powinna działać. Często używam opcjonalnych parametrów, ale używam definicji trasy opisowej. Nie powinienem definiować wartości domyślnych w adnotacji, jeśli zdefiniuję wartość domyślną w podpisie funkcji. Może musisz pominąć jedną z deklaracji domyślnych (na przykład w routingu.yml) lub spróbować użyć wartości numerycznej (lub łańcucha/bool) zamiast wartości null. Może to pomoże. –

+3

Twoja konfiguracja trasy powinna wyglądać następująco: 'defaults: {_controller:" AppReportBundle: Report: dayReport ", dni: null}' – jkucharovic

Odpowiedz

14

Oto sposób to zrobić

routing.yml

report: 
    pattern: /report/{days} 
    defaults: { _controller: "AppReportBundle:Report:dayReport", days: null } 
    requirements: 
     days: -?\d+ 

report_reroute: 
    pattern: /report/ 
    defaults: 
     _controller: FrameworkBundle:Redirect:redirect 
     route: report 
     permanent: true 

Od wymagań jest wzorcem wyrażenia regularne, to pozwala mieć wartość ujemną.

Sekcja przekierowania zmusza trasa /report/ przekierować na /report
Można przeczytać o tym na: Cookbok Entry - Elnur's Answer

Z takiego zachowania, to masz:

Route  | Action     | Parameters 
------------|------------------------|------------- 
/report  | dayReportAction  | $days = null 
/report/ | 301 to /report   | 
/report/60 | dayReportAction  | $days = 60 
/report/-4 | dayReportAction  | $days = -4 
/report/foo | 404     | 
+0

Czy można pominąć inne części na trasie w kolejności, do której odnosi się, na przykład, używając poprzednich tras: ' a-lot-of-other-stuff/report/40 ', gdzie "/ report /" może być opcjonalne, więc zakończenie będzie następujące: "a-lot-of-other-stuff/40", pod warunkiem, że mam domyślne zachowania zawarte w moich trasach? Jak możemy to osiągnąć? –

+0

@ Félix Chciałbyś utworzyć nową trasę do tej samej akcji kontrolera.Jeśli interesuje Cię pełna odpowiedź, powinieneś utworzyć nowe pytanie. – Touki

+0

Stworzyłem nowe pytanie tutaj, proszę odwiedzić: http://stackoverflow.com/questions/21766700/intermediate-route-optional-parameters-in-symfony-2 –

Powiązane problemy