1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21917 -->
4 <sect1 id="learning.quickstart.create-project">
5 <title>Das Projekt erstellen</title>
8 Um das eigene Projekt zu erstellen muss man zuerst Zend Framework herunterladen und
12 <sect2 id="learning.quickstart.create-project.install-zf">
13 <title>Zend Framework installieren</title>
16 Der einfachste Weg um Zend Framework zusammen mit einem kompletten
17 <acronym>PHP</acronym> Stack zu erhalten ist durch die Installation von <ulink
18 url="http://www.zend.com/en/products/server-ce/downloads">Zend Server</ulink>.
19 Zend Server hat native Installationsroutinen für Mac OSX, Windows, Fedora Core und
20 Ubuntu, sowie ein universelles Installationspaket das mit den meisten Linux
21 Distributionen kompatibel ist.
25 Nachdem Zend Server installiert wurde, können die Framework Dateien bei Max OSX und
26 Linux unter <filename>/usr/local/zend/share/ZendFramework</filename>, und bei Windows
27 unter <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename> gefunden
28 werden. Der <constant>include_path</constant> ist dann bereits konfiguriert um Zend
29 Framework zu verwenden.
33 Alternativ kann man <ulink url="http://framework.zend.com/download/latest">die letzte
34 Version vom Zend Framework downloaden</ulink> und dessen Inhalt extrahieren; man sollte
35 sich notieren wo man das tut.
39 Optional kann der Pfad zum Unterverzeichnis <filename>library/</filename> des Archivs
40 den eigenen <constant>include_path</constant> Einstellung in der
41 <filename>php.ini</filename> hinzugefügt werden.
45 Das ist es! Zend Framework ist jetzt installiert und bereit zur Verwendung.
49 <sect2 id="learning.quickstart.create-project.create-project">
50 <title>Das Projekt erstellen</title>
53 <title>zf Kommandozeilen Tool</title>
56 In der eigenen Zend Framework Installation ist ein Unterverzeichnis
57 <filename>bin/</filename> welches die Skripte <filename>zf.sh</filename> und
58 <filename>zf.bat</filename>, für Unix-basierende und Windows-basierende Benutzer
59 enthält. Der absolute Pfad zu diesem Skript sollte notiert werden.
63 Wo immer man einer Referenz auf den Befehl <filename>zf</filename> sieht, sollte der
64 absolute Pfad zum Skript substituiert werden. Auf Unix-basierenden Systemen, könnte
65 man die Alias Funktionalität der Shell verwenden:
66 <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>.
70 Wenn man Probleme hat das <command>zf</command> Kommandozeilen Tool zu konfigurieren
71 sollte man in <link linkend="zend.tool.framework.clitool">das
72 Handbuch</link> sehen.
77 Ein Terminal öffnen (in Windows, <command>Start -> Run</command> und anschließend
78 <command>cmd</command> verwenden). Zum Verzeichnis in dem man das Projekt beginnen will
79 navigieren. Anschließend den Pfad zum richtigen Skript verwenden und eines der folgenden
83 <programlisting language="shell"><![CDATA[
84 % zf create project quickstart
88 Die Ausführung dieses Kommandos erstellt die grundsätzliche Site Struktur, inklusive den
89 initialen Controllern und Views. Der Baum sieht wie folgt aus:
92 <programlisting language="text"><![CDATA[
97 | | `-- application.ini
99 | | |-- ErrorController.php
100 | | `-- IndexController.php
122 Wenn man an diesem Punkt, Zend Framework dem eigenen <constant>include_path</constant>
123 nicht hunzugefügt hat, empfehlen wir Ihn entweder in das eigene
124 <filename>library/</filename> Verzeichnis zu kopieren oder zu symlinken. In jedem Fall
125 sollte man entweder das <filename>library/Zend/</filename> Verzeichnis der Zend
126 Framework Installation rekursiv in das <filename>library/</filename> Verzeichnis des
127 Projekts kopieren oder symlinken. Auf unix-artigen Systemen würde das wie folgt
131 <programlisting language="shell"><![CDATA[
133 % cd library; ln -s path/to/ZendFramework/library/Zend .
136 % cd library; cp -r path/to/ZendFramework/library/Zend .
140 Auf Windows Systemen ist es am einfachsten das vom Explorer zu tun.
144 Jetzt da das Projekt erstellt wurde, sind die hauptsächlichen Artefakte die man
145 verstehen sollte, die Bootstrap, die Konfiguration, die Action Controller und die Views.
149 <sect2 id="learning.quickstart.create-project.bootstrap">
150 <title>Die Bootstrap</title>
153 Die <classname>Bootstrap</classname> Klasse definiert welche Ressourcen und Komponenten
154 zu initialisieren sind. Standardmäßig wird Zend Framework's <link
155 linkend="zend.controller.front">Front Controller</link> initialisiert und er
156 verwendet <filename>application/controllers/</filename> als Standardverzeichnis in dem
157 nach Action Controllern nachgesehen wird (mehr davon später). Die Klasse sieht wie
161 <programlisting language="php"><![CDATA[
162 // application/Bootstrap.php
164 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
170 Wie man sieht ist nicht viel notwendig um zu beginnen.
174 <sect2 id="learning.quickstart.create-project.configuration">
175 <title>Konfiguration</title>
178 Wärend Zend Framework selbst konfigurationslos ist, ist es oft notwendig die eigene
179 Anwendung zu konfigurieren. Die Standardkonfiguration wird in
180 <filename>application/configs/application.ini</filename> platziert und enthält einige
181 grundsätzliche Direktiven für die Einstellung der <acronym>PHP</acronym> Umgebung (zum
182 Beispiel ein- und ausschalten der Fehlermeldungen), zeigt den Pfad zur eigenen Bootstrap
183 Klasse (wie auch dessen Klassenname), und den Pfad zu den eigenen Action Controllern.
184 Das sieht wie folgt aus:
187 <programlisting language="ini"><![CDATA[
188 ; application/configs/application.ini
191 phpSettings.display_startup_errors = 0
192 phpSettings.display_errors = 0
193 includePaths.library = APPLICATION_PATH "/../library"
194 bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
195 bootstrap.class = "Bootstrap"
196 appnamespace = "Application"
197 resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
198 resources.frontController.params.displayExceptions = 0
200 [staging : production]
202 [testing : production]
203 phpSettings.display_startup_errors = 1
204 phpSettings.display_errors = 1
206 [development : production]
207 phpSettings.display_startup_errors = 1
208 phpSettings.display_errors = 1
212 Verschiedene Dinge sollten über diese Datei gesagt werden. Erstens kann man, wenn
213 <acronym>INI</acronym>-artige Konfigurationen verwendet werden, direkt auf Konstanten
214 referenzieren und Sie erweitern; <constant>APPLICATION_PATH</constant> selbst ist eine
215 Konstante. Zusätzlich ist zu beachten das es verschiedene definierte Sektionen gibt:
216 production, staging, testing, und development. Die letzten drei verweisen auf
217 Einstellungen der "production" Umgebung. Das ist ein nützlicher Weg die Konfiguration zu
218 organisieren und stellt sicher das die richtigen Einstellungen in jeder Stufe der
219 Anwendungsentwicklung vorhanden sind.
223 <sect2 id="learning.quickstart.create-project.action-controllers">
224 <title>Action Controller</title>
227 Die <emphasis>Action Controller</emphasis> der Anwendung enthalten den Workflow der
228 Anwendung und mappen eigene Anfragen auf die richtigen Modelle und Views.
232 Ein Action Controller sollte ein oder mehrere Methoden haben die auf "Action" enden;
233 diese Methoden können über das Web abgefragt werden. Standardmäßig folgen Zend Framework
234 URL's dem Schema <constant>/controller/action</constant> wobei "controller" auf den
235 Namen des Action Controllers verweist (ohne den "Controller" Suffix) und "action" auf
236 eine Action Methode verweist (ohne den "Action" Suffix).
240 Typischerweise benötigt man immer einen <classname>IndexController</classname>, der ein
241 Fallback Controller ist und auch als Homepage der Site arbeitet, und einen
242 <classname>ErrorController</classname> der verwendet wird um Dinge wie
243 <acronym>HTTP</acronym> 404 Fehler zu zeigen (wenn der Controller oder die Action nicht
244 gefunden wird) und <acronym>HTTP</acronym> 500 Fehler (Anwendungsfehler).
248 Der standardmäßige <classname>IndexController</classname> ist wie folgt:
251 <programlisting language="php"><![CDATA[
252 // application/controllers/IndexController.php
254 class IndexController extends Zend_Controller_Action
257 public function init()
259 /* Den Action Controller hier initialisieren */
262 public function indexAction()
270 Und der standardmäßige <classname>ErrorController</classname> ist wie folgt:
273 <programlisting language="php"><![CDATA[
274 // application/controllers/ErrorController.php
276 class ErrorController extends Zend_Controller_Action
279 public function errorAction()
281 $errors = $this->_getParam('error_handler');
283 switch ($errors->type) {
284 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
285 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
286 case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
288 // 404 Fehler -- Controller oder Action nicht gefunden
289 $this->getResponse()->setHttpResponseCode(404);
290 $this->view->message = 'Page not found';
294 $this->getResponse()->setHttpResponseCode(500);
295 $this->view->message = 'Application error';
299 $this->view->exception = $errors->exception;
300 $this->view->request = $errors->request;
306 Es ist zu sehen das (1) der <classname>IndexController</classname> keinen echten Code
307 enthält, und (2) der <classname>ErrorController</classname> auf eine "view" Eigenschaft
308 verweist. Das führt schon zu unserem nächsten Subjekt.
312 <sect2 id="learning.quickstart.create-project.views">
316 Views werden im Zend Framework in reinem alten <acronym>PHP</acronym> geschrieben. View
317 Skripte werden unter <filename>application/views/scripts/</filename> platziert, wo Sie
318 weiters kategorisiert werden indem der Name des Controllers verwendet wird. In unserem
319 Fall haben wir einen <classname>IndexController</classname> und einen
320 <classname>ErrorController</classname>, und deshalb haben wir entsprechende
321 <filename>index/</filename> und <filename>error/</filename> Unterverzeichnisse in
322 unserem View Skript Verzeichnis. In diesem Unterverzeichnissen finden und erstellen wir
323 anschließend View Skripte die jeder ausgeführten Controller Action entsprechen; im
324 Standardfall haben wir die View Skripte <filename>index/index.phtml</filename> und
325 <filename>error/error.phtml</filename>.
329 View Skripte können jedes Markup enthalten das man haben will, und verwenden das
330 öffnende <code><?php</code> Tag und das schließende <code>?></code> Tag um
331 <acronym>PHP</acronym> Direktiven einzufügen.
335 Das folgende wird standardmäßig für das <filename>index/index.phtml</filename> View
339 <programlisting language="php"><![CDATA[
340 <!-- application/views/scripts/index/index.phtml -->
357 background-image: url(http://framework.zend.com/images/bkg_header.jpg);
360 border: 2px solid #444444;
367 background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
373 <h1>Willkommen zum <span id="zf-name">Zend Framework!</span><h1 />
374 <h3>Das ist die Hauptseite unseres Projekts<h3 />
375 <div id="more-information">
377 <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
381 Hilfreiche Links: <br />
382 <a href="http://framework.zend.com/">Zend Framework Website</a> |
383 <a href="http://framework.zend.com/manual/en/">Zend Framework
391 Das <filename>error/error.phtml</filename> View Skript ist etwas interessanter da es
392 einige <acronym>PHP</acronym> Konditionen verwendet:
395 <programlisting language="php"><![CDATA[
396 <!-- application/views/scripts/error/error.phtml -->
397 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
398 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
399 <html xmlns="http://www.w3.org/1999/xhtml">
401 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
402 <title>Zend Framework Standardanwendung</title>
405 <h1>Ein Fehler ist aufgetreten</h1>
406 <h2><?php echo $this->message ?></h2>
408 <?php if ('development' == $this->env): ?>
410 <h3>Information der Exception:</h3>
412 <b>Nachricht:</b> <?php echo $this->exception->getMessage() ?>
415 <h3>Stack Trace:</h3>
416 <pre><?php echo $this->exception->getTraceAsString() ?>
419 <h3>Anfrage Parameter:</h3>
420 <pre><?php echo var_export($this->request->getParams(), 1) ?>
429 <sect2 id="learning.quickstart.create-project.vhost">
\r
430 <title>Einen virtuellen Host erstellen</title>
\r
433 Für die Zwecke dieses Quickstarts nehmen wir an das der <ulink
\r
434 url="http://httpd.apache.org/">Apache Web Server</ulink> verwendet wird. Zend
435 Framework arbeitet auch perfekt mit anderen Web Server -- inklusive Microsoft
436 Internet Information Server, Lighttpd, Nginx und andere -- aber die meisten
437 Entwickler sollten zumindest mit Apache umgehen können, und es bietet eine einfache
438 Einführung in Zend Framework's Verzeichnisstruktur und die Möglichkeiten des
443 Um den eigenen VHost zu erstellen muss man den Ort der eigenen
444 <filename>httpd.conf</filename> Datei kennen und potentiell auch wo andere
445 Konfigurationsdateien platziert sind. Einige übliche Orte sind:
\r
451 <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL, und andere)
\r
457 <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu, und andere)
\r
463 <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server auf *nix
\r
470 <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server auf Windows
\r
477 In der eigenen <filename>httpd.conf</filename> (oder
478 <filename>httpd-vhosts.conf</filename> auf anderen Systemen) muss man zwei Dinge tun.
479 Erstens sicherstellen das der <varname>NameVirtualHost</varname> definiert ist;
480 typischerweise wird man Ihn auf einen Wert von "*:80" setzen. Zweitens einen
481 virtuellen Host definieren:
\r
484 <programlisting language="apache"><![CDATA[
\r
486 ServerName quickstart.local
\r
487 DocumentRoot /path/to/quickstart/public
\r
489 SetEnv APPLICATION_ENV "development"
\r
491 <Directory /path/to/quickstart/public>
\r
492 DirectoryIndex index.php
\r
498 ]]></programlisting>
\r
501 Es gilt verschiedene Dinge zu beachten. Erstens ist zu beachten dass die
502 <varname>DocumentRoot</varname> Einstellung das Unterverzeichnis
503 <filename>public</filename> des eigenen Projekts spezifiziert; dies bedeutet das nur
504 Dateien in diesem Verzeichnis jemals direkt vom Server serviert werden. Zweitens sind
505 die Direktiven <varname>AllowOverride</varname>, <varname>Order</varname>, und
506 <varname>Allow</varname> zu beachten; diese erlauben uns <filename>htacess</filename>
507 Dateien in unserem Projekt zu verwenden. Wärend der Entwicklung ist das eine gute
508 Praxis, da es verhindert den Web Server konstant zurücksetzen zu müssen wenn man
509 Änderungen in den Site Direktiven macht; trotzdem sollte man in der Produktion den
510 Inhalt der <filename>htacess</filename> Datei in die Server Konfiguration verschieben
511 und diese deaktivieren. Drittens ist die <varname>SetEnv</varname> Direktive zu
512 beachten. Was wir hier erledigen ist das Setzen einer Umgebungsvariable für den
513 eigenen virtuellen Host; diese Variable wird in der <filename>index.php</filename>
514 geholt und verwendet um die Konstante <constant>APPLICATION_ENV</constant> für unsere
515 Zend Framework Anwendung zu setzen. In der Produktion kann diese Direktive unterdrückt
516 werden (in diesem Fall wird es auf den Standardwert "production" verweisen) oder Sie
517 explizit auf "production" setzen.
521 Letztendlich muss man einen Eintrag in der eigenen <filename>hosts</filename> Datei
522 hinzufügen welche mit dem Wert korrespondiert der in der <varname>ServerName</varname>
523 Direktive plaziert wurde. Auf *nix-artigen Systemen ist das normalerweise
524 <filename>/etc/hosts</filename>; auf Windows findet man typischerweise
525 <filename>C:\WINDOWS\system32\drivers\etc</filename> in Ihm. Unabhängig vom System
526 sieht der Eintrag wie folgt aus:
529 <programlisting language="text"><![CDATA[
\r
530 127.0.0.1 quickstart.local
\r
531 ]]></programlisting>
\r
534 Den Webserver starten (oder ihn Restarten), und man sollte bereit sein weiterzumachen.
\r
538 <sect2 id="learning.quickstart.create-project.checkpoint">
539 <title>Checkpoint</title>
542 An diesem Punkt sollte man in der Lage sein die initiale Zend Framework Anwendung
543 auszuführen. Der Browser sollte auf den Servernamen zeigen welcher im vorherigen
544 Abschnitt konfiguriert wurde; ab diesem Zeitpunkt sollte man in der Lage sein die