weppz - webbasierte Anwendungen

Herzlich Willkommen bei ihrem Ansprechpartner für webbasierte Anwendungen

ObjectRouteCollection, column und requirements

Bei dem Versuch die durch die symfony-Generatoren automatisch erstellten Routen anzupassen, stießen wir heute auf ein nicht ganz so offensichtliches Problem.

Sofern man Doctrine verwendet sehen die Einträge in der routing.yml so aus:
user:
class: sfDoctrineRouteCollection
options:
model: User
module: user
prefix_path: user
column: id
with_wildcard_routes: true

In der Regel wird die komplette Collection ja auch nur im Backend eingesetzt und dort sind diese Routen meist angemessen. Problematisch wird es nur, möchte man den entsprechenden Usern nicht unbedingt die Datenbank-ID in der URL präsentieren.

Eigentlich kein Problem, sollte man denken. Einfach den Wert von column in bspw. username geändert und die IDs sind hier verschwunden. Die Links in der List-View werden auch korrekt umgewandelt. Klickt man nun aber z.B. auf einen Link in folgender Form: “www.example.com/backend/user/admin/edit” wird er mit hoher Wahrscheinlichkeit zu folgender Fehlermeldung führen:
404 | Not Found | sfError404Exception
Action "user/admin" does not exist.

Symfony erkennt also scheinbar “admin” als Action und nicht “edit”. Grund hierfür sind die Requirements. Das Standardverhalten der sfObjectRouteCollection ist es ‘\d+’ als requirement für die column (siehe Zeile 50) vorzugeben. Dieser reguläre Ausdruck matcht aber nur auf Ziffern.

Auch wenn man nun in folgender Weise versucht diese Requirements zu ändern, kommt man nicht zum gewünschten Ergebnis:
...
with_wildcard_routes: true
requirements: { username: '\w+' }

Symfony nimmt die requirements der Route selbst als Vorgabe und überschreibt die übergebenen options der Collection. Die korrekte Fehlerbehebung sieht daher so aus:
user:
class: sfDoctrineRouteCollection
options:
model: User
module: user
prefix_path: user
column: username
with_wildcard_routes: true
requirements: { username: '\w+' }

Hierbei ist die Einrückung, wie generell in YAML-Dateien, entscheidend.

Montag, 2. November 2009 von Marco Todtenhaupt

Kommentieren