Anzeige
Anzeige
UX & Design
Artikel merken

Einführung in die Entwicklung und grundlegende Konzepte: Workshop Zend Framework

Die Firma Zend, die sich selbst als „The PHP Company“ bezeichnet, stellt mit dem Zend Framework schon seit einiger Zeit ein PHP-Application-Framework zur Verfügung und bezeichnet es als das „führende Open-Source-PHP-Framework“. In der Tat besticht das Zend Framework durch eine saubere MVC-Architektur, durch eine Vielzahl von Komponenten und eine umfangreiche Dokumentation. Dieser Artikel bietet Ihnen einen Einstieg in die Arbeit mit dem Framework und seine grundlegenden Konzepte.

12 Min. Lesezeit
Anzeige
Anzeige

Mit dem Zend Framework [1] stellt Zend schon seit März 2006 ein Application-Framework für PHP 5 zur Verfügung, das man aufgrund der hohen Modularität auch als Komponenten-Bibliothek bezeichnen kann. Damals noch als Preview-Release deklariert, ist das Zend Framework aktuell in der Version 1.0.3 verfügbar. Mittlerweile nutzen zahlreiche bekannte Größen das Framework als Basis für ihre Entwicklungen, darunter Magento (Magento Commerce) [2], IBM (QEDWiki) und bwin (pokerroom.com). Grund genug, sich selbst ein Bild von den zugrunde liegenden Nutzungskonzepten zu machen und zu schauen, wie man mit Hilfe des Zend Frameworks eigene Applikationen entwickeln kann.

Anzeige
Anzeige

Das Framework besteht aus mehreren Komponenten, die in folgende Kategorien eingeordnet werden können:

Komponente Beschreibung
Auth & Auth Authentifizierung und Autorisierung
Core Komponenten mit Querschnittsfunktion, wie Logging, Caching etc.
Data Datenbankzugriff und -abstraktion
I18N/I10N Internationalisierung und Lokalisierung
Mail, Formats & Search E-Mail, Dateiformate und Implementierung von Suchfunktionalität
MVC Implementierung eines Front-Controller-basierten Model-View-Controller-Konzepts
Other Diverses
Web/Web Services Webspezifische Funktionalität und Komponenten zur Nutzung und Bereitstellung von Web Services

Eine detaillierte Auflistung aller Komponenten finden Sie in der offiziellen Dokumentation [3]. Hier zeigt sich bereits eine Stärke des Zend Frameworks: Seine Bezeichnung weist zwar auf ein „Framework“ hin, ganz Framework-unüblich kann man allerdings selektiv wählen, welche Komponenten man verwenden möchte. Es ist problemlos möglich, die MVC-Komponenten zu verwenden, ohne etwa die Komponenten für den Datenbankzugriff einsetzen zu müssen. Demnach kann man genau wie bei Komponenten-Bibliotheken à la PEAR oder ezComponents auswählen, was man verwenden möchte und was nicht.

Anzeige
Anzeige

Den wohl meistgenutzten Bestandteil des Zend Frameworks bilden die MVC-Komponenten. Mit deren Hilfe ist es möglich, eine Front-Controller-basierte Anwendungsarchitektur aufzubauen, die dem MVC-Muster folgt.

Anzeige
Anzeige

Die Front-Controller-Implementierung „Zend_Controller_Front“ nimmt jeden Request in einer Webanwendung entgegen und wählt einen passenden Action-Controller, der den Request verarbeitet. Der passende Action-Controller wird auf Basis der Bestandteile der aufgerufenen URL ermittelt.

Vom Routing und hübschen URLs

Der Front-Controller verwendet einen Routing-Mechanismus, um den Action-Controller zu ermitteln, der einen Request verarbeitet. Entscheidend dabei sind die Bestandteile der URL, die dem Hostnamen folgen. Diese identifizieren einen Controller, eine Action und gegebenenfalls mehrere Request-Parameter.

Anzeige
Anzeige

Ein Action-Controller ist eine Klasse, die im Standardfall im Verzeichnis „applications/controllers“ liegt. Die Methoden einer solchen Controllerklasse werden als „Actions“ bezeichnet. Methodennamen in Camel-Case-Schreibweise (z. B. AirPort) werden in der URL durch den Einsatz von Bindestrichen angegeben. Ein paar Beispiele verdeutlichen dies: Angenommen, Sie hätten einen Artikel-Controller, der eine Liste von Artikeln anzeigen kann, wäre die Aufruf-URL für den Controller und die entsprechende Action http://myhost.com/artikel/zeige-liste. Die Controllerklasse müsste demnach „ArtikelController“ heißen und eine Methode „zeigeListeAction()“ anbieten. Wenn wir das Beispiel weiterdenken, möchten wir auch in der Lage sein, Artikeldetails anzuzeigen. Im Controller würden wir hierfür die Methode „detailsAction()“ implementieren. Diese würde einen Requestparameter „id“ auslesen und entsprechend den Artikel mit der gegebenen Artikelnummer anzeigen. Die URL hierfür würde wie folgt aussehen: http://myhost.com/artikel/details/id/123.

Enthält eine URL keine Informationen zu Controller oder Action, so wird als Standard jeweils „index“ verwendet. Der Standardcontroller heißt also „IndexController“ und die Standardaktion ist „indexAction()“. Der Aufruf „http://myhost.com/artikel“ würde beim Routing in „ArtikelController::indexAction()“ resultieren und dementsprechend ergibt „http://myhost.com/“ den Aufruf von „IndexController::indexAction()“. Für komplexere Anwendungen ist es möglich, Modulinformationen zur weiteren Aufteilung der Applikation in der URL zu kodieren. Informationen hierzu liefert die Dokumentation des Standard-Routers [4].

Hello World!

Nun, da Sie wissen, was das Zend Framework ist und Sie die grundlegende Funktionsweise kennen, werden Sie erfahren, wie Sie damit Webanwendungen entwickeln können. Als erstes sollten Sie sich die aktuellste Version von der offiziellen Downloadseite herunterladen. Außerdem ist es erforderlich, dass Sie mindestens PHP 5.1.4 einsetzen. Zur Installation gibt es nicht besonders viel zu sagen. Packen Sie das Archiv aus und kopieren Sie den Ordner „library“ in das Verzeichnis, das Sie für Ihre Anwendung verwenden. Als nächstes sollten Sie die Verzeichnisstruktur für Ihr Projekt anlegen. In der Dokumentation des Zend Frameworks wird hierzu ein Vorschlag gemacht, dem wir in diesem Artikel folgen. Direkt im Projektverzeichnis liegen die Ordner „application“, „html“ und „library“. Alle Klassen, die die Anwendung realisieren, liegen im Ordner „application“, „library“ enthält benötigte Bibliotheken (also auch die Klassen des Zend Frameworks) und im Ordner „html“ befinden sich Bilder, CSS-Files und weitere Dateien, die per Browser ausgeliefert werden sollen. Das vorgeschlagene Verzeichnislayout sehen Sie in der abgebildeten Ordnerstruktur weiter unten. Es ist sicherlich ratsam, dem Vorschlag von Zend zu folgen, da Entwickler, die mit dem Zend Framework vertraut sind, sich so auch in Ihrem Projekt zurechtfinden. Falls Ihnen die vorgeschlagene Verzeichnisstruktur aber nicht zusagt, können Sie problemlos Ihre eigene Variante einsetzen.

Anzeige
Anzeige

Sie müssen außerdem sicherstellen, dass Ihr Webserver so konfiguriert ist, dass das Verzeichnis „html“ als Dokument-Root definiert ist. Damit sind sämtliche Verzeichnisse und Dateien außerhalb von „html“ vor dem Zugriff per Browser geschützt. Sie können also ohne Bedenken Konfigurationsdateien oder Ähnliches im Verzeichnis „application“ ablegen.

Wie bereits erwähnt, nimmt der Front-Controller des Zend Frameworks alle eingehenden HTTP-Requests entgegen. Um zu gewährleisten, dass das möglich ist, müssen alle Requests auf die Datei „index.php“ gelenkt werden. Hierzu wird URL-Rewriting verwendet. Sie benötigen also einen Webserver, der eine entsprechende Funktionalität bietet. Für den Apache-Webserver kann folgende mod_rewrite-Regel verwendet werden, um den gewünschten Effekt zu erreichen:

mod_rewrite-Regel für den Apache Webserver
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/

Listing 1

Dadurch werden alle Requests auf nicht existente Dateien auf „index.php“ umgelenkt. So können Sie sichergehen, dass der Front-Controller nicht auch Requests auf Bilder, CSS-Files oder Ähnliches anwendet. Falls Sie nicht den Apache einsetzen, sollten Sie in der Dokumentation des Zend Frameworks [5] nachschlagen. Mit hoher Wahrscheinlichkeit finden Sie auch die passende Rewriting-Konfiguration für Ihren Webserver.

Anzeige
Anzeige

Nachdem die Verzeichnisstruktur steht und das Rewriting konfiguriert ist, kommen wir zur „index.php“. Wie schon angesprochen, werden alle Requests durch diese Datei geroutet. Hier wird der Front-Controller erzeugt, der für das Dispatching des Request verantwortlich ist. Daher bezeichnet man diese Datei auch als Bootstrapping-Datei. Das zugehörige Code-Listing zeigt, dass zuerst das Verzeichnis „library“ per „ini_set()“ zum Include-Pfad hinzugefügt wird. Dann werden die Datei mit der Klasse des Front-Controllers geladen und die statische Methode „run()“ aufgerufen, um die Request-Abarbeitung anzustoßen. Der Methode wird als Parameter das Verzeichnis der Action-Controller übergeben. Jetzt identifiziert der Front-Controller auf Basis der aufgerufenen URL den Action-Controller, der für die Verarbeitung des Request zuständig ist und überlässt diesem die fachliche Abarbeitung.

Bootstrapping der Anwendung in der index.php
<?php
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '../library');
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('../application/controllers'); ?>

Listing 2

Damit das funktioniert, müssen Sie den „IndexController“ zunächst einmal erstellen. Dazu legen Sie im Verzeichnis „applications/controllers“ die Datei „IndexController.php“ an. Deren Inhalt finden Sie im entsprechenden Code-Listing. Die Klasse erbt von „Zend_Controller_Action“, die bereits die Basisfunktionalität für alle Action-Controller implementiert. Die einzige Methode, die erstellt werden muss, ist „indexAction()“. Vorerst reicht hier ein leerer Methodenrumpf.

Die Klasse IndexController
<?php
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
	public function indexAction() {}
}
?>

Listing 3

Als letztes muss noch der passende View, also die grafische Oberfläche, zu unserem „IndexController“ und der Index-Action erstellt werden. Zuerst legen Sie dazu die Datei an. Doch wo? Auch hier spielt das URL-Mapping eine wichtige Rolle. Allgemein liegen die View-Files sortiert nach Controllern im Verzeichnis „application/views/scripts“. Da dies der View für den „IndexController“ ist, gehört er dort in den Ordner „index“, und da es sich um die „indexAction“ handelt, muss der Name der Datei „index.phtml“ lauten. Ergo erstellen Sie die Datei „application/views/scripts/index/index.phtml“.

Anzeige
Anzeige
Die View-Datei für den IndexController und die indexAction
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
		"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>Zend Framework - Hello World</title>
	</head>
	<body>
		<h1>Hallo T3N!</h1>
	</body>
</html>

Listing 4

Jetzt können Sie die Seite im Browser aufrufen und sehen ein freundliches „Hallo T3N!“. Sie mögen sich vielleicht die Frage stellen, wie das Ganze funktioniert. Zuerst einmal klappt das Zusammenspiel zwischen Controller und View deswegen, weil wir uns an die Konventionen gehalten haben. Unser Controller und die View-Datei liegen genau da, wo die im Hintergrund arbeitenden MVC-Komponenten sie erwarten, und auch die Benennung der Dateien folgt deren Erwartungen. Schauen wir uns an, wie der Request abgearbeitet wird: Der Front-Controller, den wir in der Datei „index.php“ hochfahren, nimmt initial den Request entgegen und entscheidet anhand der URL, dass der „IndexController“ und die Index-Action aufzurufen sind. Diese Klasse haben wir angelegt, jedoch haben wir nur einen leeren Methodenrumpf erstellt. Dass der korrekte View gerendert wird, haben wir einem Action-Helper zu verdanken, der per Default registriert ist. Es handelt sich um die Klasse „Zend_Controller_Action_Helper_ViewRenderer“, die automatisch den zum aktuellen Controller-Action-Paar passenden View rendert [6]. Dadurch muss nicht in jedem Controller und jeder Action eine View-Instanz erstellt werden, der gesagt wird, welche View-Datei gerendert werden soll. Dieses Standardverhalten kann bei Bedarf angepasst werden, mehr dazu später.

Wenn Sie schon ausprobiert haben, einen Controller aufzurufen, der überhaupt nicht existiert (z. B. http://myhost.com/foobar), dann werden Sie festgestellt haben, dass Sie folgende Fehlermeldung erhalten: „Zend_Controller_Dispatcher_Exception: Invalid controller specified (error) in […] on line […]“. Das liegt daran, dass in der Standardeinstellung ein Error-Handler-Plugin registriert ist. Dieses erwartet, einen Error-Controller und einen dazu passenden View zu finden. Alle notwendigen Informationen, um diese beiden Dateien anzulegen, finden Sie in der Dokumentation [7]. Nachdem Sie diese angelegt haben, wird bei jedem auftretenden Fehler unter Zuhilfenahme des Error-Handler-Plugin eine Fehlerseite angezeigt.

Etwas mehr Action bitte

Unser kleines Hello-World-Programm war zwar schon ganz schön, aber noch nicht sehr dynamisch. Wir haben bisher keine Interaktion zwischen Controller und View genutzt, um echte Daten anzuzeigen. Das wollen wir jetzt ändern. Dazu werden wir die bereits erwähnte Artikelliste und eine zugehörige Detailansicht entwickeln. Als erstes müssen wir hierzu einen ArtikelController erstellen, der über die Action-Methoden „indexAction“, „zeigeListeAction“ und „detailsAction“ verfügt. Die „indexAction“ tut nichts weiter, als die Methode „zeigeListeAction“ aufzurufen. Das Anzeigen der Liste wird somit die Standardaktion des Artikel-Controllers.

Anzeige
Anzeige

In der Methode zum Anzeigen der Artikelliste wird lediglich die View-Eigenschaft „articleData“ mit den Daten der vorhandenen Artikel gefüllt. Diese Daten lesen wir aus einer statischen Eigenschaft des Artikel-Controllers aus. In einem realen Anwendungsfall würden Sie die Daten natürlich aus einer Datenquelle Ihrer Wahl lesen und nicht hart im Controller kodieren. Wie der Name vermuten lässt, dient die Methode „detailsAction“ dazu, Detailinformationen zu einem Artikel anzuzeigen. Dazu wird der Requestparameter „id“ ausgelesen, der in diesem einfachen Beispiel die Artikelnummer repräsentiert.

Beim Auslesen verwenden wir einen Filter für Integerwerte. Dazu wird zuerst mit der Klasse „Zend_Loader“ die gewünschte Filterklasse geladen, dann instantiiert und verwendet. Dadurch stellen wir sicher, dass der ausgelesene Request-Parameter auch wirklich vom Typ „Integer“ ist und nicht in irgendeiner Art und Weise manipuliert worden ist. Wir haben nun die Artikelnummer und prüfen, ob unsere Daten einen Artikel mit der gegebenen Nummer enthalten. Ist das nicht der Fall, wird der View mit dem Namen „not-found“ gerendert, der den Konventionen entsprechend durch die Datei „application/views/scripts/artikel/not-found.phtml“ repräsentiert wird.

Die Klasse für den ArtikelController
class ArtikelController extends Zend_Controller_Action
{
	private static $data = array(
		1 => array(
			'name'  => 'Speedo FASTSKIN FS Pro Recordbreaker Bodyskin', 
			'price' => 195.00),
		2 => array(
			'name'  => 'Speedo FASTSKIN FS Pro Recordbreaker Kneeskin ', 
			'price' => 169.00),
		3 => array(
			'name'  => 'Speedo Fastskin Male FS II Jammer', 
			'price' => 75.00),
		4 => array(
			'name'  => 'Speedo FS II Printed Jammer', 
			'price' => 99.00)
	);    
	public function indexAction() {
		$this->_forward('zeige-liste');
	}    
	public function zeigeListeAction() {
		$this->view->articles = self::$data;
	}   
	public function detailsAction() {
		Zend_Loader::loadClass('Zend_Filter_Int');
		$filter = new Zend_Filter_Int();
		$id = $filter->filter($this->getRequest()->getParam('id'));
		if (! array_key_exists($id, self::$data)) {
			$this->render('not-found');
		}  else {
			$this->view->articleData = self::$data[$id];
		}
	}
}

Listing 5

Greift man auf diese Weise in das Rendering ein, wird der ViewRenderer
„Action-Helper“ nicht mehr aktiv, um den Standardview zu rendern. Sofern der Artikel existiert, setzen wir die View-Eigenschaft
„articleData“ und weisen dieser die entsprechenden Daten zu. Den Rest
erledigt hier dann der ViewRenderer.

Anzeige
Anzeige

Den Artikel-Controller haben wir damit ausführlich besprochen. Was nun noch fehlt, sind die Views. Views sind nichts weiter als HTML-Dateien, in die man PHP-Code einbetten kann. Innerhalb einer solchen View-Datei hat man durch die Variable „$this“ Zugriff auf die aktuelle View-Instanz.

Der View „not-found“ enthält lediglich den Text „Artikel nicht gefunden“ und entspricht damit dem View aus unserem vorhergehenden Beispiel „Hello World“. Fehlen also noch die Views „zeige-liste“ und „details“. Der View für die Listenansicht bekommt die Artikeldaten vom Controller durch Setzen der Eigenschaft „articles“. Im Quellcode des Views können wir dadurch mit einer foreach-Schleife über diese Daten iterieren. Für jeden Artikel geben wir eine Tabellenzeile mit den Spalten „Name“ und „Preis“ aus. Zur Sicherheit verwenden wir dabei die „escape“-Methode der View-Instanz. Die gerenderte HTML-Seite sieht dann aus wie im abgebildeten Screenshot.

Der View "zeige-liste"
<h1>Gefundene Artikel (<?php echo count($this->articles)?>):</h1>
<table>
	<tr>
		<th>Artikel</th>
		<th>Preis</th>
	</tr>
	<?php foreach($this->articles as $key => $a) { ?>
	<tr>
		<td>
			<a xhref="/artikel/details/id/<?php echo $key ?>">
				<?php echo $this->escape($a['name']); ?>
			</a>
		</td>
		<td>
			<?php echo $this->escape(number_format($a['price'], 2, ',', '.')); ?> EUR
		</td>
	</tr>
<?php } ?>
</table>

Listing 6

Zur Darstellung der Detailansicht eines Artikels wird der View „details“ verwendet. Die View-Instanz hat vom Controller die Artikeldaten in der Eigenschaft „articleData“ gesetzt bekommen. Diese können nun innerhalb des Views an den gewünschten Stellen ausgegeben werden.

Der details View (applications/views/scripts/artikel/details.phtml
<h1>Artikeldetails</h1>
<p>Name: 
	<?php echo $this->escape($this->articleData['name']); ?></p>
<p>Preis: 
	<?php echo $this->escape(
		number_format($this->articleData['price'], 2, ',', '.')); 
	?> EUR
</p>

Listing 7

Hierbei wird aus Sicherheitsgründen wieder von der „escape“-Methode
Gebrauch gemacht. Wie das Code-Listing zeigt, werden der Artikelname
und der Preis ausgegeben.

Fazit

Sie haben im Rahmen dieses Artikels gelernt, wie das Zend Framework grundlegend funktioniert und eine einfache Applikation unter Verwendung der MVC-Komponenten erstellt. Dennoch gibt es viele Dinge, die der Artikel nicht ansprechen konnte. Beispielsweise haben wir nur ein sehr einfaches Bootstrap-Skript verwendet. Mit einem erweiterten Bootstrapping können Sie das Exception-Handling detaillierter kontrollieren und vieles mehr.

In größeren Anwendungen sollten Sie von diesen Möglichkeiten definitiv Gebrauch machen. Falls Sie jetzt darüber nachdenken, das Zend Framework in Ihren Projekten einzusetzen, sollten Sie die Dokumentation von Zend_Controller und Zend_View lesen, um sich ein Bild von den Features zu machen, die hier nicht in aller Tiefe behandelt werden konnten. In der Dokumentation werden Sie auch nähere Informationen zu den vielen weiteren Komponenten des Frameworks finden.

Entwickler nimmt das Zend Framework viel Arbeit bei der Erstellung einer grundlegenden Systemarchitektur ab. Es bietet eine saubere, Front-Controller-basierte MVC-Architektur, auf die man mit seiner eigenen Applikation aufsetzen kann sowie eine Vielzahl weiterer Komponenten für zahllose Einsatzgebiete.

Auch in größeren Projekten geht die Ordnung nicht verloren, da man die Applikation problemlos in mehrere Module aufteilen kann, ohne das Routing umstellen zu müssen. Die Architektur ist äußerst flexibel gehalten und lässt dadurch auch eigene Anpassungen problemlos zu. Wem zum Beispiel die Verwendung des Zend_View nicht gefällt, der kann problemlos die Template-Engine seiner Wahl einsetzen. Alles in allem eine runde Sache.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige