Beiträge getagged mit OOP

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.

, , ,

1 Kommentar

Zend Framework mit Symfony nutzen

symfony logoIm 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.

, , , ,

1 Kommentar

Object Relational Mapping

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:

Fazit:

Schneller und performanter werden Anwendungen durch ORMs nicht, aber das Arbeiten mit einer Datenbank wird durch sie wesentlich vereinfacht.

, , , ,

3 Kommentare

PHP entwickeln mit Symfony – ein Einstieg

symfony logoWeb-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 »

, ,

1 Kommentar

Objektorientierte Programmierung mit PHP?!

Mit PHP objektorientiert programmieren? Dann auch noch an Entwurfsmuster aus der Softwareentwicklung halten? Am Ende muss ich vielleicht auch noch Programmeigenschaften beweisen? Ist das nicht nur Gerede von abgehobenen PHP Programmieren? OK der Beweis von Programmeigenschaften geht wohl wirklich zu weit, aber Objektorientierung und Entwurfsmuster sind in PHP mehr als nur sinnvoll und Grundlage für eine gute Software.

Warum nun eigentlich objektorientiert?

Um eine Internetseite verwalten und pflegen zu können muss man den Überblick bewahren. Bei kleinen Seiten geht das auch mit prozeduraler Programmierung, nur wird die Seite etwas größer, kann Verwaltung oder gar Optimierung ohne OOP doch sehr lästig werden. Meist sucht man sich dann durch viele Zeilen Quelltext um einen Flaschenhals zu beseitigen, obwohl man schon froh sein kann, wenn man in einem prozeduralen Quelltext überhaupt weiß wo die Bremse zu suchen ist.

Objektorientierter Quelltext ist Strukturierter

und dadurch übersichtlicher. Daten und dazugehörige Funktionen werden von anderen gekapselt und bilden so eine eigene Einheit. Ein Datenbank Objekt hat zum Beispiel seine eigenen Variablen um Verbindungsdaten ab zu speichern und Funktionen um Querries zu schicken. Warum sollte das Auto Objekt auch Zugriff auf die Verbindungsdaten haben? Das Auto hat seine eigenen Daten und Funktionen und greift auf die Datenbank nur über die vorgesehen Schnittstellen zu. So ist alles im Programm gut geordnet. Wenn sich später die Datenbank ändert, brauch man nur ein Objekt zu öffnen und zu bearbeiten und fremde Objekte können nicht Daten in anderen Objekten manipulieren.

Objekte sind leicht wieder zu verwenden.

Bleiben wir bei dem Auto-Beispiel. Ein Auto ist wie ein Motorrad ein Fahrzeug und teilt mit diesem auch gewisse Eigenschaften. So gibt es bei beiden die Angaben zur Geschwindigkeit und Gewicht, so wie eine Funktion mit der man diese Eigenschaften setzen kann. Außerdem hat ein Auto und ein Motorrad die Funktion fahren und eine zum Bremsen. Also kann man erst einmal eine Klasse Fahrzeug erstellen, welche alle gemeinsamen Funktionen aufweist und Eigenschaften speichern kann. Als nächstes gibt es eine Klasse Auto und eine für das Motorrad, welche beide von der Fahrzeugklasse erben. So muss ich nicht bei jedem neuen Fahrzeug eine fahren Funktion definieren, die bei allen Fahrzeugen ausrechnet wie weit das Fahrzeug mit der angegebenen Geschwindigkeit in einer gewissen Zeit kommt. In den Kindklassen definiert man dann nur noch Klassen spezifische Funktionen. Das Motorrad bekommt 2 Räder als Konstante und das Auto 4 (Ich geh einfach mal vom Normalzustand aus). Das Auto hat einen Kofferraum und das Motorrad nicht… . Ähnlich ist das auch bei Objekten ohne Vererbung. Ein T-Shirt hat immer eine Farbe und eine Größe. Also kann T-ShirtA und T-ShirtB erstellen und dabei die selbe Klasse verwenden.

Mit Objekten ist es meistens leichter einen komplizierten Algorithmus um zu setzen, da Objekte näher an der Vorstellung liegen. Da man auch in der Vorstellung Objekten mit Eigenschaften und Funktionen beschreibt.

Fazit:

Mit objektorientierter Programmierung ist man oft flexibler, kann Quelltext leichter wiederverwenden und das Programm ist Übersichtlicher. Deshalb kann man effizienter und leichter im Team programmieren, auch wenn das entwickeln des Konzeptes dadurch etwas mehr Zeit in Anspruch nehmen kann.

,

Keine Kommentare

Zend Framework

Seit ein paar Monaten arbeite ich mit dem Zend Framework aus dem Hause Zend Technologie. Dabei handelt es sich um ein recht junges MVC Application-Framework auf der Basis von PHP. Neben den MVC Komponenten (Controller und View) verfügt es über eine Vielzahl an nützlichen Klassen und Methoden, wie zum Beispiel eine Komponente für die Datenbankanbindung oder für Authentifizierung und Rechtevergabe. An der Entwicklung des Frameworks arbeitet ein Team was aus vielen erfahrenden und teils bekannten Personen besteht.

Ich programmiere derzeit ein kleines Projekt mit dem Zend Framework, welches ich euch an anderer Stelle noch vorstellen werde. Die Möglichkeiten die sich bei der Arbeiten mit dem MVC Entwurfsmuster ergeben sind einfach klasse.

Mit dem Zend Framework kann man effizient Anwendungen objektorientiert umsetzen.

Eine recht nette deutschsprachige Community ist das ZFforum hier findet man am Anfang schnell Hilfe. Einen guten einstieg bietet das Tutorial von Rob Allen oder die deutsche Dokumentation.

, , ,

Keine Kommentare