Beiträge getagged mit Symfony
Ein Blick auf Doctrine Core Behaviors
Beim Planen einer Datenbank/des Modells für eine Internetseite trifft man immer wieder auf Objekte (aus dem Modell) mit Gemeinsamen Eigenschaften/Verhalten. Plant man einen Blog hat man zum Beispiel ein Klasse für Artikel und eine für Kommentare, beide verfügen wahrscheinlich über Attribute wie created_at und updated_at. Für solche Gemeinsamen Eigenschaften gibt es in Doctrine so genannte Templates/Behaviors. Ich möchte hier nicht erklären wie man Templates selbst schreibt, sondern viel mehr zeigen welche Core Behaviors Doctrine bereitstellt.
Das einfachste Verhalten ist wohl das Timestampable Behavior. Stellt man dieses Verhalten in seiner schema.yml ein
article:
actAs:
Timestampable:
wird automatisch ein Feld created_at und updated_at erstellt. Wenn man nun ein Artikel erstellt speichert Doctrine automatisch das Erstellungsdatum, so wie das Datum der letzten Änderung. Mit weiteren Einstellungen kann man den Namen der Felder verändern, die Speicherung ausschalten oder das Format bestimmen.
Ein weiteres Verhalten ist das Versionable Behavior. Mit Hilfe dieses Templates kann man zum Beispiel eine einfache Versionierung seiner Blogartikel umsetzen. Hierfür passen wir den actAs Bereich unserer schema.yml wie folgt an:
article:
actAs:
Timestampable:
Versionable:
versionColumn: version
className: %CLASS%Version
Nun erstellt Doctrine eine neue Tabelle namens article_Version. Wenn man nun einen Artikel ändert, wird das alte Artikel-Objekt in der Tabelle article_Version abgespeichert und mit einer Versionsnummer versehen. In der Anwendung kann man dann einfach auf ältere Versionen zugreifen.
Für unsere Blogartikel wären außerdem noch Suchmaschinen optimierte und vom Menschen lesbare URLs interessant. Dafür brauchen wir eine eindeutige Überschrift, was man aber nicht immer hat. Auch hierfür gibt es ein Behavior namens Sluggable. Sluggable erstellt aus zuvor angegebenen Feldern eindeutige Slugs (hängt notfalls Zahlen an das Ende und ersetzt Leerzeichen mit Bindestrichen) und speichert diese ab. Diese Slugs kann man dann als eindeutige Identifizierung für die Blogartikel benutzen. Wir passen also wieder unsere schema.yml an:
article:
actAs:
Timestampable:
Versionable:
versionColumn: version
className: %CLASS%Version
Sluggable:
fields: [title]
Auch hier legt Doctrine ein neues Feld namens Slug an und speichert dort eine Eindeutige Zeichenkette ab. Natürlich gibt es auch hier noch weitere Konfigurationsmöglichkeiten.
Nun möchten wir unsere Blogartikel noch einfach durchsuchbar machen, ohne weitere Bibliotheken wie Apache Lucene bzw Zend Lucene zu nutzen. Auch hierfür gibt es wieder ein Verhalten namens Searchable. Also passen wir wieder unsere schema.yml an:
article:
actAs:
Timestampable:
Versionable:
versionColumn: version
className: %CLASS%Version
Sluggable:
fields: [title]
Searchable:
fields: [title, article]
Nun legt Doctrine eine Tabelle article_index an und speichert dort ausgewählte Keywords ab. Indiziert werden hier Wörter die im title oder article Feld häufig vorkommen. Später kann man dann mit dem ArticleTable Objekt nach einem Eintrag suche. Dieses Behaviors bietet noch viele weitere Konfiguartions- bzw Anpassungsmöglichkeiten.
Es gibt noch ein paar weitere Core Behaviors, wie I18n, NestedSet, Geographical oder SoftDelete, welche sehr individuell konfiguriert werden könne. Auch die hier gezeigten Behaviors verfügen noch über viele weitere Einstellungsmöglichkeiten, welche man in der Doctrine Documentation nachlesen kann.
Durch den Einsatz dieser Templates kan man beim Erstellen des DB-Layouts und beim Arbeiten mit dem DatenObjekten viel Zeit sparen, da ein Großteil der Arbeit von Doctrin automatisch gemacht wird.
Symfony 2.0 Preview Release testen
Nach dem Symfony 2.0 auf der Symfony Live 2010 vorgestellt wurde, kann man es sich nun auch selbst runterladen und die Preview Version testen.
Die Wichtigste Anforderung an den Server um Symfony 2.0 zu installieren, ist PHP 5.3, da dies nicht in den aktuellen Ubuntu Paketquellen enthalten ist. Eine gute und einfache Anleitung zum installieren von PHP 5.3 findet man auf denkeinfach.de.
Nach dem ich PHP 5.3 installiert hatte, habe ich mir einen neuen Ordner auf meinem Webserver erstellt (alle Kommandos per SSH) und per GIT die Sandbox kopiert:
mkdir /var/www/sf2 cd /var/www/sf2 git clone git://github.com/symfony/symfony-sandbox.git ./
Danach die Rechte für cache und logs gesetzt:
chmod 777 hello/logs chmod 777 hello/cache
Dann habe ich mir einen Vhost auf das web Verzeichnis gesetzt, zum testen kann man es aber auch direkt öffnen. Als erstes sollte man die Datei check.php öffnen um zu prüfen, ob man alle Voraussetzungen erfüllt.
http://<server_url>/<web_pfad>/check.php
Hier sollten möglichst viele Voraussetzungen grün sein, rote Felder im Pflichtteil sollte man beseitigen. Danach kann man seine erste Symfony 2.0 Anwendung im Browser starten:
http://<server_url>/<web_pfad>/hello/world http://<server_url>/<web_pfad>/index_dev.php/hello/world
Eine weitere Demoanwendung findet man hier. Und den oft zitierten Geschwindigkeitsvergleich hier und einen anderen hier.
Auch wenn sich Symfony 2.0 noch in “HIGHLY EXPERIMENTAL” Stadium befindet, kann man es in der Sandbox wenigstens testen. Bleibt also bis Late 2010 zu warten, dem geplanten release Zeitraum.
Symfony Live 2010
Seit gestern findet in Paris Symfony live 2010 statt. Ich konnte mich leider nicht auf den Weg nach Paris machen, um an der Konferenz teilzunehmen (Muss ich noch bis Oktober auf den Symfony Day Cologne warten). Da es vielen sicher genauso geht, habe ich mal ein paar Informationen zusammen gesammelt, welche ich euch natürlich nicht vorenthalten möchte.
Da wäre zum einen die Slideshow von Matthew Weier O’Phinney über Zend Framework im zusammenspeil mit Symfony, worüber ich auch schon hier geschrieben habe.
Dann gibt es noch zwei schöne Vorträge über Doctrine 2/Doctrine Migrations von Jonathan Wage und Dennis Benkert (Der einzige deutsche Redner?).
Im Symfony Project Blog gibt es eine Zusammenfassung des ersten Tags. Und zu guter Letzt eine der besten Zusammenfassungen (auf Deutsch): symfony-live-2010-tag-1-doctrine-1-2-training und symfony-live-2010-tag-2
PS: Hier noch der Twitter Tag: #sflive2010
Zend Framework mit Symfony nutzen
Im Internet wird derzeit viel über das Zend Framework im Zusammenhang mit Symfony geredet. Zum Einen werden beide Frameworks miteinander verglichen, zum Anderen sollen sie gemeinsam genutzt werden. Einen Vergleich finde ich nicht wirklich sinnvoll. Symfony ist meiner Meinung nach ein reines MVC Framework. Das Zend Framework ist mehr eine Ansammlung von Komponenten und deshalb mehr ein Komponenten Framework. Aber allein über dieses Thema könnte man einen eigenen Artikel schreiben.
Wenn man das Zend Framework als Komponenten Framework sieht, ist der Schritt nicht groß, es als Bibliothek in einer Symfony Anwendung zu nutzen. Anders rum macht es für mich aus den oben genannten Gründen wenig Sinn. Das Integrieren des ZFs ist eigentlich spielend einfach, muss man doch nur den Autoloader an geeigneter Stelle instanziieren. Ob man dazu gleich ein neues Projekt starten sollte weiss ich nicht so recht. Ich habe einfach mal ein kleines Tutorial dazu geschrieben (Symfony Version 1.4):
Ich gehe davon aus, dass ihr bereits ein Symfony Projekt angelegt habt, sonst sollte ihr euch hier schlau machen. Ich habe in meinen Projekten die Symfony Dateien immer als svn Checkout unter “lib/vendor/symfony” liegen. Das Gleiche mache ich nun mit dem Zend Framework und checke die aktuelle Version aus:
svn co <ZF_SVN_URL> ./lib/vendor/zf
Um aus dem Branch 1.10 zu verwednen, kann man diese Adresse nutzen. Wenn man die Dateien geladen hat, bearbeitet man “config/ProjectConfiguration.class.php” und fügt folgende Zeilen in der setup Funktion hinzu:
public function setup()
{
... bereits vorhandener Quelltext ...
// diese Zeilen hinzufügen
//ZendFramework integration
$zf_path = sfConfig::get('sf_lib_dir').'/vendor/zf/library';
set_include_path($zf_path.PATH_SEPARATOR.get_include_path());
require_once($zf_path.'/Zend/Loader/Autoloader.php');
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Namespace_');
}
Als erstes wird der Pfad des ZF Verzeichnisses gespeichert und der Includepfad gesetzt. Dann wird der Autoloader geladen, instanziiert und der Namespace registriert.
Man könnte diesen Quelltext auch in einer ApplicationConfiguration hinzufügen, dann könnte man das ZendFramework aber auch nur in dieser Application verwenden. Jetzt muss man nur noch einen Clear Cache machen und alles sollte funktionieren:
./symfony cc
Nun kann man in seiner Anwendung einfach auf die Klassen des Zend Frameworks zugreifen.
Object Relational Mapping
Verfasst von David unter PHP, Webentwicklung und Co am 20. Januar 2010
Was ist das Problem?
Die meisten Webanwendungen speichern ihre Daten in relationalen Datenbanken und sind selbst objektorientiert programmiert. Während des Programmablaufs sind die Daten in Objekten gekapselt, diese serialisiert in der Datenbank zu hinterlegen wäre keine gute Idee, würde man doch die Vorteile einer relationalen Datenbank einbüßen. Ein Objekt hat einen Zustand, Verhalten und eine Identität. Eine relationale Datenbank kennt nur Relationen und dazugehörige Tupel. Das Problem, Objekte in einer relationalen Datenbank zu speichern, nennt sich “Object-relational impedance mismatch“.
Wie kann man das Problem lösen?
Helfen kann man sich mit einer (eineindeutigen) Abbildung zwischen Datenobjekten und Tabellen einer Datenbank. Ein Objekt wird auf eine Tabelle abgebildet und Attribute auf eine Spalte der Tabelle. Der Primärschlüssel eines Tupels stellt die Identität des Objekts dar. Vererbung und Referenzen auf andere Objekte kann man dann über Fremdschlüssel lösen. Object relational Mapper sind Bibliotheken, die solche Abbildungen implementieren. Anstatt direkt auf die Datenbank zu zugreifen, kann man objektorientiert mit den Datenobjekten arbeiten, welche sich um die Interaktion mit der Datenbank kümmern. Allerdings muss man meistens Einbußen bei der Geschwindigkeit hinnehmen.
Object relational Mapper in PHP:
Die Anzahl von ORMs in PHP nimmt stetig zu. Fast jedes Application Framework ist mittlerweile mit einem ORM ausgestattet, sei es eine Eigenentwicklung oder ein fremdes ORM. Deshalb kann ich hier nur ein paar Beispiele nennen und keinen Anspruch auf Vollständigkeit erheben. Wenn ihr mir weitere Adressen in den Kommentaren schreibt, ergänze ich diese natürlich.
ORM Bibliotheken in PHP:
- cakePHP (Application Framework mit ORM)
- DB_DataObject
- Doctrine (Teil des Symfony Frameworks)
- pdoMap
- Propel (Teil des Symfony Frameworks)
- …
Fazit:
Schneller und performanter werden Anwendungen durch ORMs nicht, aber das Arbeiten mit einer Datenbank wird durch sie wesentlich vereinfacht.
PHP entwickeln mit Symfony – ein Einstieg
Web-Frameworks gibt es viele, am bekanntesten sind wohl Ruby on Rails und Django, aber auch in PHP muss man sich mittlerweile entscheiden, welches Framework man nutzt. Diese Entscheidung kann euch zwar niemand abnehmen, empfehlenswert ist Symfony aber auf jeden Fall.
Was ist Symfony?
Symfony ist, wie die meisten Web-Frameworks, ein MVC Framework. Durch das MVC Entwurfsmuster ist der Quelltext sauber strukturiert und eine spätere Wartung bzw. Erweiterung einfacher. Zum Rest des Beitrags »
Letzte Kommentare