Social Software powered by Instant Communities
Springe direkt: zur Navigationzum Inhaltzur Sidebar

Archiv für 'symfony'

Symfony 1.0 und Regex in routing.yml

17.11.2008

Helge hatte neulich ja hier schon einmal was über die Regex Patterns in der routing.yml von Symfony geschrieben.
Nachdem ich heute fast wieder verrückt geworden bin, habe ich nun ein paar sinnvolle Dinge herausgefunden:

Ich habe versucht folgendes Pattern zu matchen:

numerischeId-UrlSafeTitle

Doch egal welches Pattern ich dafür verwenden wollte – wenn ich im Cache in die generierte Datei config_routng.yml.php schaute, wurde der zweite Teil meines Patterns immer auf mysteriöse Weise geändert:

Dies funktioniert:

id_title_route:  url: /:resourceIdTitle

param: { module: forum, action: view}
  requirements: { respurceIdTitle: ^[0-9]+-.w+ }

und ergibt genereriert im php File:

'resourceIdTitle' => '^[0-9]+-.w+',

Also Zahlen gefolgt von einem Bindestrich gefolgtvon Buchstaben. Leider matchen so noch keine Urls mit  Bindestrichen

Dies funktioniert nicht:

requirements:  { respurceIdTitle: ^[0-9]+-.[w-]+ }

Daraus wird:

'resourceIdTitle' => '^[0-9]+-.[0-9]+',

Merkwürdigerweise wird die zweite Chracter Class (das in den eckigen Klammern) immer zu “0-9″ konvertiert. Ich habe noch einige andere Lösungen probiert (z.B. ^[0-9]+-[^\/]*+) ,  die leider aber alle fehlschlugen mit dem selben merkwürdigen Ergebnis. Letztlich bin ich dann auf die Idee gekommen, einfach mal eine andere YML Syntax auszuprobieren:

id_title_route:  url: /:resourceIdTitle

param: { module: forum, action: view}

requirements:

  resourceIdTitle: "[0-9]+-[w+-]+"

Beim Definieren von Regex-Patterns in der routing.yml sollte man also immer diese Syntax benutzen, dann bleiben die Anweisungen so erhalten, wie man sie geschrieben hat. Ich hoffe damit ist das Thema ein für allemal vom Tisch :)

Zum Testen habe ich übrigens diesen Online Regex Tester benutzt, den ich sehr empfelen kann, falls es mal irgendwo hakt.

Update: die kurze Syntax funktioniert ebenfalls, wenn man die Regular Expression in Quotes setzt, nutzt man die lange Syntax, sind die Quotes nich erforderlich

Doctrine 1.0 veröffentlicht

03.09.2008

Der PHP OR-Mapper Doctrine liegt nun in der Verison 1.0 vor. Wir setzen Docrtrine seit ca. einem Jahr bei  sixgroups.com ein und sind sehr zufrieden damit. Neben der nahtlosen Integration ins Symfony Framework lässt es sich auch als einzelne Library zur Abstraktion der DB-Schicht verwenden. Wir suchen für die deutsche Dokumentation noch weitere Mitübersetzer Wer Lust dazu hat, etwas für dieses tolle Projekt zu tun, kann sich als Übersetzer im Wiki eintragen.

Symfony Routing Requirements – Regex Pattern

22.07.2008

Das Routing System von Symfony 1.0 ist ja eigentlich sehr cool. Manchmal bringt es einen aber auch gerne zum Wahnsinn, nämlich immer dann, wenn man versucht mit eigenen Regex-Patterns bestimmte Routen zu erzeugen. Zumindest geht es mir so.

In unserm Fall wurden Länder- und Kontinentnamen in der URL als Parameter übergeben. Diese Namen enthielten nicht nur Zeichen, die dem Pattern \w+ entsprechen, sondern leider auch Zeichen, die in diesem Pattern (nur alphanumerische Zeichen) nicht enthalten sind, z.B. das Plus Zeichen, das zum Enkodieren von Leerzeichen in URLs verwendet werden kann. Die entsprechenden Routen greifen dann nicht mehr, sobald solch ein Parameter in der URL auftaucht.

Nach einer guten Weile Trial and Error und  ist dann am Ende folgende Regex herausgekommen: [0-9a-zA-ZüöäÜÄÖ%\+-]+

Da Regular Expressions gerne Fragezeichen in Gesichter Zaubern, das ganze in Worten: Der erste Teil (0-9a-zA-Z) bildet alphanumerische Zeichen ab. Dazu sind noch Umlaute, Prozent, Minus und Plus erlaubt. Die ersten Minuszeichen werden dabei als Range interpretiert (a bis z), während das letzte Minus als eigenständiges Zeichen verstanden wird. Das Plus muss mit einem Backslash escaped werden, da es im Rahmen von Regexpressions eine besondere Bedeutung hat, nämlich die Häufigkeit des Vorkommens festzulegen. Das zweite Pluszeichen hinter den eckigen Klammern hat genau diese Aufgabe und definiert, dass der beschriebene String aus mindestens einem oder mehreren der angegebenen Zeichen bestehen muss.

Eine vollständige Routing-Regel sieht dann z.B. so aus:


discover_country:
url: /entdecken/:continent/:safename/:listtype/:page/*
param: { module: discover, action: index, page: 1, listtype: Uebersicht, marker: Laender }
requirements: {  continent: \w+, safename: [0-9a-zA-ZüöäÜÄÖ%\+-]+, listtype: \w+, page: \d+ }

Das gemeine ist, dass “normale” Regex nicht greifen:
^[0-9a-zA-ZüöäÜÄÖ%\+-]+$ funktioniert jedenfalls nicht, obwohl das Pattern laut Regextester eigentlich korrekt sein sollte. Die Zeichen ^ und $, die jeweils Anfang und Ende eines Strings markieren, müssen also in den Symfony-Routingregeln weggelassen werden.

Hoffentlich hilft dieser Tipp einigen Menschen bei der Suche nach der Lösung für ähnliche Probleme.

Symfony1.1 mit Doctrine Tutorial

17.06.2008

Gestern auf dem Symfony Project Weblog erschienen: Ein Tutorial wie man Symfony 1.1 mit Doctrine einsetzt. Wir haben bisher schon mit dem OR-Mapper Doctrine gearbeitet und sind sehr zufrieden damit. Besonders die Syntax liegt mir gegenüber Propel deutlich mehr. Viel ändert sich in Symfony 1.1 auch nicht, lediglich die Pake Tasks wurden an die neuen Konventionen angepasst. Allen, die einen einfachen Einstieg in Symfony mit Doctrine suchen, empfehle sich dises Tutorial.

You are currently browsing the archives for the symfony category.

Creative Commons License
This work is licensed under a
Creative Commons Attribution-Share Alike 2.5 License.
t8d blogged mit WordPress