Quicknavi |
|
Grundlagen
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 ä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¶m2=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.
|