# Das Projekt erstellen

Um das eigene Projekt zu erstellen muss man zuerst Zend Framework herunterladen und extrahieren.

## Zend Framework installieren

Der einfachste Weg um Zend Framework zusammen mit einem kompletten PHP Stack zu erhalten ist durch die Installation von Zend Server. Zend Server hat native Installationsroutinen für Mac OSX, Windows, Fedora Core und Ubuntu, sowie ein universelles Installationspaket das mit den meisten Linux Distributionen kompatibel ist.

Nachdem Zend Server installiert wurde, können die Framework Dateien bei Max OSX und Linux unter `/usr/local/zend/share/ZendFramework`, und bei Windows unter `C:\Program Files\Zend\ZendServer\share\ZendFramework` gefunden werden. Der `include_path` ist dann bereits konfiguriert um Zend Framework zu verwenden.

Alternativ kann man die letzte Version vom Zend Framework downloaden und dessen Inhalt extrahieren; man sollte sich notieren wo man das tut.

Optional kann der Pfad zum Unterverzeichnis `library/` des Archivs den eigenen `include_path` Einstellung in der `php.ini` hinzugefügt werden.

Das ist es! Zend Framework ist jetzt installiert und bereit zur Verwendung.

## Das Projekt erstellen

zf Kommandozeilen Tool

In der eigenen Zend Framework Installation ist ein Unterverzeichnis `bin/` welches die Skripte `zf.sh` und `zf.bat`, für Unix-basierende und Windows-basierende Benutzer enthält. Der absolute Pfad zu diesem Skript sollte notiert werden.

Wo immer man einer Referenz auf den Befehl `zf` sieht, sollte der absolute Pfad zum Skript substituiert werden. Auf Unix-basierenden Systemen, könnte man die Alias Funktionalität der Shell verwenden: `alias zf.sh=path/to/ZendFramework/bin/zf.sh`.

Wenn man Probleme hat das `zf` Kommandozeilen Tool zu konfigurieren sollte man in das Handbuch sehen.

Ein Terminal öffnen (in Windows, `Start -> Run` und anschließend `cmd` verwenden). Zum Verzeichnis in dem man das Projekt beginnen will navigieren. Anschließend den Pfad zum richtigen Skript verwenden und eines der folgenden ausführen:

    % zf create project quickstart

Die Ausführung dieses Kommandos erstellt die grundsätzliche Site Struktur, inklusive den initialen Controllern und Views. Der Baum sieht wie folgt aus:

    quickstart
    |-- application
    |   |-- Bootstrap.php
    |   |-- configs
    |   |   `-- application.ini
    |   |-- controllers
    |   |   |-- ErrorController.php
    |   |   `-- IndexController.php
    |   |-- models
    |   `-- views
    |       |-- helpers
    |       `-- scripts
    |           |-- error
    |           |   `-- error.phtml
    |           `-- index
    |               `-- index.phtml
    |-- library
    |-- public
    |   |-- .htaccess
    |   `-- index.php
    `-- tests
        |-- application
        |   `-- bootstrap.php
        |-- library
        |   `-- bootstrap.php
        `-- phpunit.xml

Wenn man an diesem Punkt, Zend Framework dem eigenen `include_path` nicht hunzugefügt hat, empfehlen wir Ihn entweder in das eigene `library/` Verzeichnis zu kopieren oder zu symlinken. In jedem Fall sollte man entweder das `library/Zend/` Verzeichnis der Zend Framework Installation rekursiv in das `library/` Verzeichnis des Projekts kopieren oder symlinken. Auf unix-artigen Systemen würde das wie folgt aussehen:

    # Symlink:
    % cd library; ln -s path/to/ZendFramework/library/Zend .

    # Copy:
    % cd library; cp -r path/to/ZendFramework/library/Zend .

Auf Windows Systemen ist es am einfachsten das vom Explorer zu tun.

Jetzt da das Projekt erstellt wurde, sind die hauptsächlichen Artefakte die man verstehen sollte, die Bootstrap, die Konfiguration, die Action Controller und die Views.

## Die Bootstrap

Die Bootstrap Klasse definiert welche Ressourcen und Komponenten zu initialisieren sind. Standardmäßig wird Zend Framework's Front Controller initialisiert und er verwendet `application/controllers/` als Standardverzeichnis in dem nach Action Controllern nachgesehen wird (mehr davon später). Die Klasse sieht wie folgt aus:

    // application/Bootstrap.php

    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
    }

Wie man sieht ist nicht viel notwendig um zu beginnen.

## Konfiguration

Wärend Zend Framework selbst konfigurationslos ist, ist es oft notwendig die eigene Anwendung zu konfigurieren. Die Standardkonfiguration wird in `application/configs/application.ini` platziert und enthält einige grundsätzliche Direktiven für die Einstellung der PHP Umgebung (zum Beispiel ein- und ausschalten der Fehlermeldungen), zeigt den Pfad zur eigenen Bootstrap Klasse (wie auch dessen Klassenname), und den Pfad zu den eigenen Action Controllern. Das sieht wie folgt aus:

    ; application/configs/application.ini

    [production]
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
    includePaths.library = APPLICATION_PATH "/../library"
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
    appnamespace = "Application"
    resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
    resources.frontController.params.displayExceptions = 0

    [staging : production]

    [testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

    [development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

Verschiedene Dinge sollten über diese Datei gesagt werden. Erstens kann man, wenn INI-artige Konfigurationen verwendet werden, direkt auf Konstanten referenzieren und Sie erweitern; `APPLICATION_PATH` selbst ist eine Konstante. Zusätzlich ist zu beachten das es verschiedene definierte Sektionen gibt: production, staging, testing, und development. Die letzten drei verweisen auf Einstellungen der "production" Umgebung. Das ist ein nützlicher Weg die Konfiguration zu organisieren und stellt sicher das die richtigen Einstellungen in jeder Stufe der Anwendungsentwicklung vorhanden sind.

## Action Controller

Die Action Controller der Anwendung enthalten den Workflow der Anwendung und mappen eigene Anfragen auf die richtigen Modelle und Views.

Ein Action Controller sollte ein oder mehrere Methoden haben die auf "Action" enden; diese Methoden können über das Web abgefragt werden. Standardmäßig folgen Zend Framework URL's dem Schema `/controller/action` wobei "controller" auf den Namen des Action Controllers verweist (ohne den "Controller" Suffix) und "action" auf eine Action Methode verweist (ohne den "Action" Suffix).

Typischerweise benötigt man immer einen IndexController, der ein Fallback Controller ist und auch als Homepage der Site arbeitet, und einen ErrorController der verwendet wird um Dinge wie HTTP 404 Fehler zu zeigen (wenn der Controller oder die Action nicht gefunden wird) und HTTP 500 Fehler (Anwendungsfehler).

Der standardmäßige IndexController ist wie folgt:

    // application/controllers/IndexController.php

    class IndexController extends Zend_Controller_Action
    {

        public function init()
        {
            /* Den Action Controller hier initialisieren */
        }

        public function indexAction()
        {
            // Action Body
        }
    }

Und der standardmäßige ErrorController ist wie folgt:

    // application/controllers/ErrorController.php

    class ErrorController extends Zend_Controller_Action
    {

        public function errorAction()
        {
            $errors = $this->_getParam('error_handler');

            switch ($errors->type) {
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
                case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                    // 404 Fehler -- Controller oder Action nicht gefunden
                    $this->getResponse()->setHttpResponseCode(404);
                    $this->view->message = 'Page not found';
                    break;
                default:
                    // Anwendungsfehler
                    $this->getResponse()->setHttpResponseCode(500);
                    $this->view->message = 'Application error';
                    break;
            }

            $this->view->exception = $errors->exception;
            $this->view->request   = $errors->request;
        }
    }

Es ist zu sehen das (1) der IndexController keinen echten Code enthält, und (2) der ErrorController auf eine "view" Eigenschaft verweist. Das führt schon zu unserem nächsten Subjekt.

## Views

Views werden im Zend Framework in reinem alten PHP geschrieben. View Skripte werden unter `application/views/scripts/` platziert, wo Sie weiters kategorisiert werden indem der Name des Controllers verwendet wird. In unserem Fall haben wir einen IndexController und einen ErrorController, und deshalb haben wir entsprechende `index/` und `error/` Unterverzeichnisse in unserem View Skript Verzeichnis. In diesem Unterverzeichnissen finden und erstellen wir anschließend View Skripte die jeder ausgeführten Controller Action entsprechen; im Standardfall haben wir die View Skripte `index/index.phtml` und `error/error.phtml`.

View Skripte können jedes Markup enthalten das man haben will, und verwenden das öffnende <?php Tag und das schließende ?> Tag um PHP Direktiven einzufügen.

Das folgende wird standardmäßig für das `index/index.phtml` View Skript installiert:

    <!-- application/views/scripts/index/index.phtml -->
    <style>

        a:link,
        a:visited
        {
            color: #0398CA;
        }

        span#zf-name
        {
            color: #91BE3F;
        }

        div#welcome
        {
            color: #FFFFFF;
            background-image: url(http://framework.zend.com/images/bkg_header.jpg);
            width:  600px;
            height: 400px;
            border: 2px solid #444444;
            overflow: hidden;
            text-align: center;
        }

        div#more-information
        {
            background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
            height: 100%;
        }

    </style>
    <div id="welcome">
        <h1>Willkommen zum <span id="zf-name">Zend Framework!</span><h1 />
        <h3>Das ist die Hauptseite unseres Projekts<h3 />
        <div id="more-information">
            <p>
                <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
            </p>

            <p>
                Hilfreiche Links: <br />
                <a href="http://framework.zend.com/">Zend Framework Website</a> |
                <a href="http://framework.zend.com/manual/en/">Zend Framework
                    Handbuch</a>
            </p>
        </div>
    </div>

Das `error/error.phtml` View Skript ist etwas interessanter da es einige PHP Konditionen verwendet:

    <!-- application/views/scripts/error/error.phtml -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Zend Framework Standardanwendung</title>
    </head>
    <body>
      <h1>Ein Fehler ist aufgetreten</h1>
      <h2><?php echo $this->message ?></h2>

      <?php if ('development' == $this->env): ?>

      <h3>Information der Exception:</h3>
      <p>
          <b>Nachricht:</b> <?php echo $this->exception->getMessage() ?>
      </p>

      <h3>Stack Trace:</h3>
      <pre><?php echo $this->exception->getTraceAsString() ?>
      </pre>

      <h3>Anfrage Parameter:</h3>
      <pre><?php echo var_export($this->request->getParams(), 1) ?>
      </pre>
      <?php endif ?>

    </body>
    </html>

## Einen virtuellen Host erstellen

Für die Zwecke dieses Quickstarts nehmen wir an das der Apache Web Server verwendet wird. Zend Framework arbeitet auch perfekt mit anderen Web Server -- inklusive Microsoft Internet Information Server, Lighttpd, Nginx und andere -- aber die meisten Entwickler sollten zumindest mit Apache umgehen können, und es bietet eine einfache Einführung in Zend Framework's Verzeichnisstruktur und die Möglichkeiten des Rewritings.

Um den eigenen VHost zu erstellen muss man den Ort der eigenen `httpd.conf` Datei kennen und potentiell auch wo andere Konfigurationsdateien platziert sind. Einige übliche Orte sind:

- `/etc/httpd/httpd.conf` (Fedora, RHEL, und andere)

- `/etc/apache2/httpd.conf` (Debian, Ubuntu, und andere)

- `/usr/local/zend/etc/httpd.conf` (Zend Server auf *nix Maschinen)

- `C:\Program Files\Zend\Apache2\conf` (Zend Server auf Windows Maschinen)

In der eigenen `httpd.conf` (oder `httpd-vhosts.conf` auf anderen Systemen) muss man zwei Dinge tun. Erstens sicherstellen das der `NameVirtualHost` definiert ist; typischerweise wird man Ihn auf einen Wert von "*:80" setzen. Zweitens einen virtuellen Host definieren:

    <VirtualHost *:80>
        ServerName quickstart.local
        DocumentRoot /path/to/quickstart/public

        SetEnv APPLICATION_ENV "development"

        <Directory /path/to/quickstart/public>
            DirectoryIndex index.php
            AllowOverride All
            Order allow,deny
            Allow from all
        </Directory>
    </VirtualHost>

Es gilt verschiedene Dinge zu beachten. Erstens ist zu beachten dass die `DocumentRoot` Einstellung das Unterverzeichnis `public` des eigenen Projekts spezifiziert; dies bedeutet das nur Dateien in diesem Verzeichnis jemals direkt vom Server serviert werden. Zweitens sind die Direktiven `AllowOverride`, `Order`, und `Allow` zu beachten; diese erlauben uns `htacess` Dateien in unserem Projekt zu verwenden. Wärend der Entwicklung ist das eine gute Praxis, da es verhindert den Web Server konstant zurücksetzen zu müssen wenn man Änderungen in den Site Direktiven macht; trotzdem sollte man in der Produktion den Inhalt der `htacess` Datei in die Server Konfiguration verschieben und diese deaktivieren. Drittens ist die `SetEnv` Direktive zu beachten. Was wir hier erledigen ist das Setzen einer Umgebungsvariable für den eigenen virtuellen Host; diese Variable wird in der `index.php` geholt und verwendet um die Konstante `APPLICATION_ENV` für unsere Zend Framework Anwendung zu setzen. In der Produktion kann diese Direktive unterdrückt werden (in diesem Fall wird es auf den Standardwert "production" verweisen) oder Sie explizit auf "production" setzen.

Letztendlich muss man einen Eintrag in der eigenen `hosts` Datei hinzufügen welche mit dem Wert korrespondiert der in der `ServerName` Direktive plaziert wurde. Auf *nix-artigen Systemen ist das normalerweise `/etc/hosts`; auf Windows findet man typischerweise `C:\WINDOWS\system32\drivers\etc` in Ihm. Unabhängig vom System sieht der Eintrag wie folgt aus:

    127.0.0.1 quickstart.local

Den Webserver starten (oder ihn Restarten), und man sollte bereit sein weiterzumachen.

## Checkpoint

An diesem Punkt sollte man in der Lage sein die initiale Zend Framework Anwendung auszuführen. Der Browser sollte auf den Servernamen zeigen welcher im vorherigen Abschnitt konfiguriert wurde; ab diesem Zeitpunkt sollte man in der Lage sein die Startseite zu sehen.