Quantcast
Channel: test.ical.ly » Symfony Live 2010
Viewing all articles
Browse latest Browse all 9

Symfony Live 2010 – Tag 1 (Doctrine 1.2 Training)

$
0
0

Der erste Symfony Live 2010 Tag ist den Trainings gewidmet. Neben den Neuerungen in symfony 1.3/1.4, der Kombination  von symfony und dem Zend Framework, Hosting von symfony Projekten und Webservices gab es eine Doctrine 1.2 Session mit Jonathan Wage. Für diese Session habe ich mich entschieden, da ich zwar schon die ein oder andere Erfahrung mit Doctrine gesammelt habe, aber mehr erfahren möchte über die Neuerungen in Doctrine 1.2 und vielleicht den ein oder anderen Kniff lernen, den ich noch nicht kannte. Leider waren die Training Sessions mutual exclusive und man konnte nur eine wählen. Sonst hätte ich mir noch die Webservices mit Dustin Whittle angesehen, aber man kann ja nicht alles haben..

Doctrine Logo

Der Workshop fängt an mit einem simplen kleinen Blogsystem. Alles hand coded mit direkten SQL Aufrufen auf eine SQLite Datenbank (version_00 in den unten angehängten Sourcen). In mehreren Iterationen soll nun das gesamte Blogsystem nach Doctrine migriert werden.

Raus aus der Metro

Raus aus der Metro

Über den Champs Elysée

Über den Champs Elysée

Und schon mitten im Training

Und schon mitten im Training

Da doch schon einige Doctrine Erfahrung bei den Teilnehmern vorhanden war, haben wir die Iterationen nach der dritten verlassen und John hat uns ein Doctrine Feature nach dem anderen vorgestellt, was in einer Frage und Antwort Runde mündete.

Trotzdem hier nochmal die Iterationen, weil ich denke, dass sie ganz brauchbar sind, wenn man bestehenden (Spaghetti) Code in Richtung Doctrine migrieren möchte und darüber hinaus solange und sooft kleinteilig refaktorisiert, bis man wirklich alle Vorteile von Doctrine nutzt. Die Details schaut bitte in dem unten angehängten PDF und den Sourcen in der .zip Datei nach.

  1. Iteration, (version_01) Ersetzen der sqlite_* Funktionen durch Doctrine DBAL Calls
  2. Iteration, (version_02) Models erstellen, CLI Tool erstellen und DQL nutzen
  3. Iteration, (version_03) Custom Finder Methoden und Named Queries
  4. Iteration, (version_04) Erweitern des Blogs durch hinzufügen eines Autor Model, Tags und Typen
  5. Iteration, (version_05) Spezialielle BlogPosts wie Artikel oder Tutorial durch Column Aggregation Inheritance
  6. Iteration, (version_06) Automatisierung von Verhalten durch Events und Hooks
  7. Iteration, (version_07) Nutzen der Behaviours Sluggable und Timestampable
  8. Iteration, (version_08) Paginierung
  9. Iteration, (version_09) Datenbank Schema in YAML definieren
  10. Iteration, (version_10) Fixtures verwenden

Der Code nach jeder Iteration ist im Archiv in einer eigenen Version abgelegt, so dass man immer nachschauen kann, wie’s aussehen sollte.

Auch wenn ich hier bereits für mich den Schluss ziehen muss, dass sich das Training nicht so wirklich gelohnt hat. Für Anfänger war es glaub ich gut, aber dazu zähle ich mich nicht mehr.

Trotzdem sind zwischendurch genügend Dinge aufgeblitzt, die es auch für mich interessant gemacht haben. Details, die mir neu waren oder die ich schon vergessen hatte, manches, was ich nochmal nachlesen will und einiges, was ich unbedingt ausprobieren möchte.

Ich schreibe das mal nur so in Stichsätzen runter. Für mich zur Erinnerung und für euch zur Inspiration. :)

  • Ab Folie 40 wird das Validation Feature von Doctrine vorgestellt. Interessant dabei ist, dass save() Aufrufe im Fehlerfall dann eine Exception werfen, was aber mit trySave() entsprechend abgefangen werden kann.
  • Schön an Doctrine 1.2 ist, dass alle Records den Array Access implementieren. Man kann also mit Array Notation auf alle Attribute und sogar Relationen zugreifen. Das sollte man in seinen Templates auch unbedingt machen, denn dann kann man im Nachgang den Hydration Mode auf Arrays stellen, was das ganze Objekt Instantiieren spart und sich somit mehr als positiv auf die Performance auswirkt.
  • Datenbank Funktionen wie NOW() kann man folgendermassen verwenden: $blogPost->updated_at = new Doctrine_Expression(‘NOW()’);
  • Mit Doctrine 1.2 werden standardmässig @property DocComments mitgeneriert für eine saubere Auto Completion in IDEs wie Eclipse
  • Das Model Loading Verhalten kann entweder Doctrine::MODEL_LOADING_AGGRESSIVE (default) sein und immer alle Modelle laden oder aber Doctrine::MODEL_LOADING_CONSERVATIVE wobei dann nur die benötigten Models geladen werden, was wesentlich schneller ist.
  • Die Klasse Doctrine besteht nur noch aus Rückwärtskompatibilitätsgründen. Stattdessen ist Doctrine_Core zu verwenden. Das ermöglicht eine einfachere Einbindung von Doctrine als SVN External.
  • Der Hydration Mode Doctrine_Core::HYDRATE_ON_DEMAND benötigt viel weniger Speicher! Vor allem in PHP 5.2 Systemen ist das spürbar.
  • Für besonders grosse Textfelder kann man den Datentyp clob verwenden.
  • Behaviours kann man nesten. Sehr cool!
  • Mittels deleteByPrefix(..) kann man Gruppen von Cache Keys beispielsweise aus dem APC oder Memcache Cache löschen.
  • Um z.B. Custom Hydrators oder Behaviours zu testen empfiehlt es sich, Testmodelle zu verwenden, die diese kapseln. Das kann mit einer Testdatenbank auf SQLite Basis ergänzt werden.
  • Doctrine 1 lässt sich wegen seiner starken Koppelung nur schwer mocken. Mit Doctrine 2 wird das alles wesentlich einfacher sein.
  • DQL kann in Doctrine 2 auch mit EBNF beschrieben werden.
  • Mit LeftJoin(‘b.foo f WITH f.type = xx’) kann man eine Relation noch weiter eingrenzen (z.B. Typ einer Telefonnummer).

Nach einer angenehmen Fahrt durch die Stadt habe ich dann den Abend im Hotel verbracht und noch ein wenig gearbeitet. Morgen mehr.

Workshop Sourcen: Symfony Live 2010 – Doctrine 1.2 Training Sourcen

Workshop Folien: Symfony Live 2010 Doctrine-1.2 Training


Viewing all articles
Browse latest Browse all 9

Latest Images

Trending Articles



Latest Images