Adventure,PHP,Framework,PageController,FrontController,Pattern,Objektorientierung,OO,Software,Design,Wiederverwendbarkeit,UML,Tutorial,Benchmark,ausgezeichnete Performance

Suche:    
Downloads  |  SVN!  |  Roadmap  |  Forum!  |  Bugtracking  |  Gästebuch  |  Backlinks!  |  Referenzen!  |  Sitemap  |  Impressum  
 
Deutsch | English Adventure PHP Framework  Bookmark @ Technorati Bookmark @ del.icio.us Bookmark @ Mr. Wong Bookmark @ Simpy Bookmark @ Google Bookmark @ Digg.com Adventure PHP Framework Seite 013-Grundlagen drucken!
«Vorherige Seite | Startseite | Nächste Seite »

Grundlagen

Artikel bewerten:
Dieser Artikel wurde noch nicht bewertet. Bewerten Sie diesen Artikel als erstes!

1. Einführung

Das vorliegende Framework versteht sich als Hilfsmittel für die Implementierung von objektorientierten, generischen und wiederverwendbaren PHP-Applikationen. Es werden eine Reihe von wichtigen OO-Design-Pattern implementiert und das Framework bietet Lösungen für bekannte Problemstellungen:
  • Model-View-Controller-Pattern:
    Das Model-View-Controller-Pattern ist ein Pattern der Präsentations-Schicht. Es zielt darauf ab ein flexibles Programmdesign zu generieren. Insbesondere diktiert es eine strikte Trennung der Bereiche Model, View und Controller. Damit wird die Anwendung für spätere Änderungen einfach pfleg- und erweiterbar. Zudem reduziert sich die Komplexität der einzelnen Komponenten und einzelne Softwareteile werden wiederverwendbar.
    Das Modell enthält dabei die darzustellenden Daten oder Informationen über das Verhalten der Software. Der View beschreibt die Art der Darstellung und wird in der Regel durch Template-Dateien repräsentiert. Der Controller kennt sowohl das Model als auch den View und kann durch Kenntnis dieser den View mit den gewünschten Daten aufbauen.

    Siehe hierzu auch http://de.wikipedia.org/wiki/MVC.

  • Composite-Pattern:
    Die Objekte der Präsentations-Schicht sind alle vom zentralen Objekt coreObject, bzw. vom Objekt Document abgeleitet. Auf Grund dieser Tatsache können beliebige Objekte, die von Document erben in den Objektbaum einer Seite eingehängt werden. So kann die Präsentations-Schicht um beliebige Elemente auf einfache Art und Weise erweitert werden.

    Siehe hierzu auch http://en.wikipedia.org/wiki/Composite_pattern.

  • 3-Schicht-Architektur:
    Wie bereits angesprochen, unterstützt das Framework die Implementierung von Applikationen in der 3-Schicht-Architektur. Diese sieht vor, dass Anwendungen in die Schichten Präsentation, Geschäfts-Logik und Daten-Schicht unterteilt sind die alle für sich genommen eine bestimmte Funktionalität kapseln. Die Präsentations-Schicht - oder kurz genannt "pres" - ist für die Darstellung der Applikation in einer (HTML-)GUI zuständig. Sie kennt alle HTML-Elemente und ebenso die Business-Schicht (biz), die der Präsentations-Schicht Daten und Informationen zur Art und Inhalt der Darstellung liefert. Innerhalb der biz-Schicht werden die Geschäftsprozesse der Anwendung gekapselt und ausgeführt. Die Datenschicht beschäftigt sich einzig und allein mit der Daten-Accquise und -Persistenz. Hierzu kennt sie die Datenquelle und hat Tools zur Verfügung mit denen aus der Datenquelle gelesen werden kann.

  • Domain-Object-Pattern:
    Das Domain-Object-Pattern beschreibt, dass Daten, die in einer Anwendung verarbeitet werden in dedizierten Daten-Objekten gehalten werden. Das Pattern wird in der Regel in Verbindung mit dem Data-Mapper-Pattern verwendet. Die Kommunikations-Objekte zwischen den oben ganannten Schichten sollte immer das Domain-Object sein. Ein "Domain-Object" kann in der realen Anwendung auch eine Liste von Domain-Objekten oder ein Baum von unterschiedlichen Domain-Objekten sein. Die Ausprägung ist abhängig von der Anwendung.

  • Data-Mapper-Pattern:
    Ein Data-Mapper ist per se ein "Übersetzer". Er Übersetzt das Datenmodell der Datenbank in das Datenmodell der Applikation. Diese müssen nicht zwangsläufig übereinstimmen und tun es in vielen Anwendungsfällen auch nicht. Beispiel: In einer Anwendung werden Personen und deren Adressen verwaltet. Das Datenmodell hat für das Objekt "Person" und das Objekt "Adresse" je eine eigene Tabelle. Um die Zugehörigkeit zwischen den beiden Objekten abbilden zu können existiert eine dritte Tabelle - die Beziehungstabelle. Möchte die Anwendung nun das Objekt "Person" mit seiner Adresse laden, so muss der Data-Mapper zuerst die Person und danach anhand der Beziehung die Adresse zum Objekt hinzuladen. Beim Speichern des Objekts Person geht der Data-Mapper den Weg umgekehrt und persistiert jeweils Adresse und anschließend die Daten des Objekts "Person".

Das Adventure-PHP-Framework unterstützt den Programmierer dabei in allen genannten Design-Modellen. Das Framework versteht sich bewusst als Programmier-Hilfe und nicht als fertige Anwendung, die lediglich konfiguriert werden muss. Das Software-Design kann nur vom Entwickler kommen, das Framework kann den Entwickler nur bei der Implementierung unterstützen!


2. Aufbau und Bedeutung der Ordner-Struktur

Wie in der objektorientierten Welt üblich, sind die Komponenten des Frameworks in einer nach Abhängigkeit und Bedeutung strukturierten Ordnern untergebracht. Hier bei definiert der Ordnername das Paket und der Dateiname den Namen der Klasse. Die relevanten Dateien können innerhalb von Programmteilen mit der Funktion import() eingebunden werden.

In den Release-Paketen sind folgende Ordner-Strukturen enthalten:
apps/ (Verzeichnis alle Quellcode-Dateien)
     [config/ (Verzeichnis für Konfigurationsdateien)]

     core/ (Verzeichnis für die Core-Komponenten)
          benchmark/
          configuration/
          database/
          errorhandler/
          filesystem/
          filter/
          frontcontroller/
          logging/
          pagecontroller/
          service/
          session/
          singleton/

     modules/ (Verzeichnis für die Module)
             comments/
             guestbook/
             kontakt4/
             pager/
             socialbookmark/

     [sites/ (Verzeichnis für Webseitendateien)]

     tools/ (Verzeichnis für die Tools-Komponenten)
           cache/
           datetime/
           form/
                taglib/
           html/
                taglib/
           image/
           link/
           mail/
           string/
           validator/
           variablen/
Die Ordner core und tools beinhalten die Kern-Bestandteile des Frameworks und werden mit jedem Release ausgeliefert. Darin befinden sich u.a. die Implementierung des Page-Controllers (/apps/core/pagecontroller/), des configurationManagers (/apps/core/configuration/) oder Tools wie ein mailSender (/apps/tools/mail/) bzw. der linkHandler (/apps/tools/link/).

Der Ordner modules ist dazu gedacht, auf den core- und tools-Komponenten aufsetzende Module aufzunehmen, die entweder im Release enthalten sind (z.B. Gästebuch, Kontaktformular) oder von Ihnen implementierte Module zum Einsatz in Webseiten oder Web-Applikation.

Unterhalb von config werden Konfigurationsdateien abgelegt, die in den unterschiedlichen Teilen der Software zum Einsatz kommen. Unter Konfigurationsdateien fallen Sprachdateien, Parameterdefinitionen für Applikationen oder auch MySQL-Statement-Dateien.

Da es ein Punkt des Codexes des Frameworks ist möglichst immer wiederverwendbare Code-Teile zu erstellen, wird zwischen den Ordnern modules und sites unterschieden. Der Ordner modules beinhaltet über alle sites hinweg einsetzbare Software-Teile, der Ordner sites die eigentlichen Webseiten-Projekte. Als ein Webseiten-Projekt wird nicht nur eine Ausgabe-Seite angesehen, sondern z.B. auch ein Backend (CMS).

Die API-Dokumentation beschreibt die Inhalte der Ordner nochmals genauer.


3. Aufbau einer einfachen Applikation

Das Framework arbeitet im sogenannten "Postback"-Modus. Das bedeutet, dass ein Webseiten-Projekt in der Regel eine zentrale Datei (meist index.php, da diese im Webserver als DirectoryIndex konfiguriert ist) besitzt und über diese alle Anfragen abgewickelt werden. Ist dieses Verhalten nicht gewünscht, können auch weitere Dateien gemäß ihren Aufgaben definiert werden. Es hat sich jedoch als praktikabel erwiesen, mit einer Bootstrap-Datei zu arbeiten, da sich dadurch der Pflegeaufwand der Code-Dateien minimiert.


3.1. Aufbau einer index.php

Eine einfache Applikation besteht grundsätzlich aus einer Bootstrap-Datei und einem Master-Template. Die Bootstrap-Datei läd das Template, erstellt daraus eine Seite, die anschließend transformiert und ausgegeben wird. Im Master-Template ist definiert, wie die Applikation aufgebaut ist und welche weiteren Templates, TagLibs oder Module inkludert werden.

Eine typische index.php enthält folgende Code-Teile:
   // Page-Controller einbinden
   
include_once('./apps/core/pagecontroller/pagecontroller.php');

   
// Seite erzeugen
   
$Page = new Page('{1}');

   
// Seiten-Struktur aufbauen
   
$Page->loadDesign('{2}','{3}');

   
// Seite transformieren und ausgeben
   
echo $Page->transform(); 
Den mit {x} gekennzeichneten Platzhaltern kommt dabei folgende Bedeutung zu:
  • {1}: Name der Webseite. Dieser Name betitelt lediglich den Namen des Objekts "Page" und wird nicht zur Anzeige gebracht. Das Argument ist zudem optional.
  • {2}: Namespace zum Basis-Template bzw. Context. Um ein Design laden zu können sind die Angaben "Namespace" bzw. "Pfad" und "Designname" notwendig. Der erste Teil ("Namespace" bzw. "Pfad") wird zugleich als Context für Konfigurationsbelange eingesetzt (siehe hierzu Konfiguration).
  • {3}: Name des Basis-Templates. Hier kann entweder der Name des Basis-Templates ohne dessen Endung oder ein Sub-Pfad incl. Name des Basis-Templates ohne Endung angegeben werden.

3.2. Aufbau des Basis-Templates

Templates spielen im Adventure PHP Framework eine entscheidende Rolle. Abstrakter betrachtet ist dabei Knoten einer Webseite eine kleine MVC-Einheit, die aus einem Model (zumeist dem Model der Applikation oder Webseite), dem View(-Template), einem XML-/HTML-Template, und einem Controller (DocumentController), falls erwünscht, besteht. Den Kern des Frameworks stellt der PageController dar, der aus einem Template einen Objektbaum erzeugt und dafür sorgt, dass bei der Transformation die entsprechenden Controller ausgeführt werden.

Mit der Gestaltung der Templates definiert der Entwickler quasi die Komplexität der Seite und den Aufbau des Objektbaums. In der index.php wird mit der Methode loadDesign() ein initiales Template einer Applikation oder eines Modules geladen, das die oberste Ebene des Aufbaus der Seite definiert. Jedes eingebundene Template bildet dabei einen Kind des aktuellen Baum-Knotens. Die Verschachtelungstiefe ist dabei nicht beschränkt. Die folgende Codebox zeigt ein einfaches Template, das als Layout einer Webseite dienen kann:
<html>
<head>
  <title>Demo</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
...
</body>
</html>
Weiterführende Beispiele zu Templates können den Kapiteln Hallo Welt! und Templates entnommen werden, das Tutorial Webseite erstellen gibt eine weitere Einführung in das Erstellen von Web-Seiten und -Applikationen.


3.3. Basis-Konfiguration

Im Gegensatz zu früheren Versionen (< 1.7) benötigt das Framework zunächst keine weitere Konfiguration. Intern werden jedoch einige Basis-Konfigurationsparameter im Namespace apf::core der Registry verwaltet. Müssen diese für den speziellen Anwendungsfall angepasst werden, so kann das in der Boostrap-Datei wie nachfolgend dargestellt bewerkstelligt werden. Die Registry dient nicht nur als zentraler Informationspool für das Framework, sondern kann auch für die Steuerung von konkreten Anwendungen eingesetzt werden.
   // Page-Controller einbinden
   
include_once('./apps/core/pagecontroller/pagecontroller.php');

   
// Instanz der Registry beziehen
   
$Reg = &Singleton::getInstance('Registry');

   
// Umgebungsvariable manipulieren
   
$Reg->register('apf::core','Environment','MY_ENV');

   
// Basis-Pfad der Applikation manipulieren
   
$Reg->register('apf::core','URLBasePath','http://mybaseurl.de');

   
// URLRewriting-Modus &auml;ndern (true: URL wird mit / dargestellt, false: "normale" URLs)
   
$Reg->register('apf::core','URLRewriting',true);

   
// Log-Verzeichnis anpassen
   
$Reg->register('apf::core','LogDir','/Pfad/zu/meinem/Log/Verzeichnis');

   
// Seite erzeugen
   
$Page = new Page('{1}');

   
// Seiten-Struktur aufbauen
   
$Page->loadDesign('{2}','{3}');

   
// Seite transformieren und ausgeben
   
echo $Page->transform(); 
Die aufgeführten Parameter haben folgende Bedeutung:
  • Environment: (verwendet von: configurationManager, MySQLxHandler, MySQLHandler, SQLiteHandler, ...)

    Jede Konfigurations-Datei besteht aus vier unterschiedlichen Bestandteilen:

    • Namespace: Ordner, unterhalb dem alle Konfigurationsdateien dieser Anwendung liegen
    • Context: Aktueller Context der Applikation
    • Umgebung: z.B. für Entwicklung, Test und Live
    • Dateinamen: Dateiname der Konfigurationsdatei

    Diese Abstraktion wurde eingeführt, damit eine Anwendung oder ein Modul in unterschiedliche andere Anwendungen oder Module eingebunden werden kann und auf unterschiedlichen Systemen zur gleichen Zeit ohne Änderung des Quellcodes lauffähig ist. Für das Laden von Konfigurationen gibt es jedoch standardisierte Methoden, so dass sich der Programmierer darum nicht mehr kümmern muss. Weiterführendes dazu kann im Kapitel Konfiguration nachgelesen werden.

    Standard-Wert: "DEFAULT"


  • URLBasePath: (verwendet von: bbCodeParser, socialBookmarkManager, Suche, ...)

    Viele Module verlinken auf sich selbst oder ander Bereiche eines Moduls oder einer Webseite. Aus diesem Grund muss bekannt sein, wie die Basis-URL der Seite lautet. Der Registry-Wert URLBasePath definiert diese.

    Standard-Wert: "HTTP_HOST-Wert des $_SERVER-Arrays"


  • URLRewriting: (verwendet von: PageController, FrontController, linkHandler, frontcontrollerLinkHandler, ...)

    Der vorliegende PageController unterstützt URL-Rewriting. Unter URL-Rewriting versteht der Autor die Verwendung von URLs der Form http://www.domain.tld/param1/value1/param2/value2 statt http://www.domain.tld?param1=value1&param2=value2. Ist der Wert auf "true" gesetzt, so werden die mit den linkHandler und frontcontrollerLinkHandler generierten Links in der rewriteten Form ausgegeben.

    Standard-Wert: "false"


  • LogDir: (verwendet von: Logger, ...)

    Um zentrales Logging zu ermöglichen, muss der Pfad, in den Log-Dateien geschreiben werden zentral bekannt gegeben werden. Der Pfad wird von der Klasse Logger verwendet.

    Standard-Wert: "./logs"


  • LibPath: (verwendet von: bbCodeParser, ...)

    Die Direktive LibPath speichert den Basis-Pfad, in dem die Programmdateien abgelegt wurden. Der Pfad wird dynamisch gesetzt und ist nur für den lesenden Zugriff freigegeben.


Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.

«   1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |

1 Christian
06.07.2008, 23:09:45
Hinweis zum letzten Kommentar:
Seit Release 1.7-beta wird das URL-Rewriting über den Registry-Wert "URLRewriting" im Namespace "apf::core" konfiguriert (siehe oben).

2 Markus Köhler
02.09.2007, 13:32:12
Nachtrag zur Konstante APPS__URL_REWRITING:
Diese wird ebenso für den frontcontrollerLinkHandler verwendet um zu unterscheiden, ob dieser im URL-Rewriting-Modus arbeitet, oder nicht.

Powered by WebRing.