Applikation

Die Applikation (bzw. Anwendung) bildet die abgeschlossene Laufzeitumgebung innerhalb der ein Request bearbeitet wird. Ihr Hauptzweck liegt darin, einige Informationen über den vorliegenden Request zu sammeln und diesen dann zur Bearbeitung an den richtigen Controller weiterzuleiten. Außerdem dient dieses Objekt als zentraler Speicherort für Konfigurationsdaten der gesamten Anwendung. Man nennt dieses Objekt auch Front-Controller.

Das Applikationsobjekt wird vom Startscript als Singleton erzeugt und kann daher an jeder Stelle über Yii::app() abgerufen werden.

1. Konfiguration

Standardmäßig besteht eine Applikation aus einer Instanz der Klasse CWebApplication. Beim Instanziieren dieses Objekts wird in der Regel eine Konfigurationsdatei (oder ein Array mit Konfigurationsdaten) übergeben, um die nötigen Einstellungen an der Applikation vorzunehmen. Alternativ dazu kann man auch eine Klasse von CWebApplication ableiten und die Konfigurationsdaten dort "hardcoden" (also direkt im Klassenquelltext hinterlegen).

Das Konfigurationsarray besteht aus Schlüssel-Wert-Paaren. Schlüssel und Wert entsprechen den Eigenschaftsnamen und (Start-)Werten des Applikationsobjekts. Mit dem folgenden Array wird z.B. die Eigenschaft name und defaultController (Standardcontroller) konfiguriert:

array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)

Für gewöhnlich wird die Konfiguration in einer eigenen PHP-Datei abgelegt (z.B. protected/config/main.php). Dieses Script liefert das Konfigurationsarray folgendermaßen zurück:

return array(...);

Der Name der Konfigurationsdatei kann als Parameter an den Konstruktor der Applikation übergeben werden oder wie im folgenden Beispiel an Yii::createWebApplication(). Für gewöhnlich geschieht dies im Startscript:

$app=Yii::createWebApplication($configFile);

Tipp: Falls die Konfigurationsdaten sehr umfangreich oder kompliziert strukturiert sind, können sie auch auf mehrere Dateien aufgeteilt werden. In der eigentlichen Konfigurationsdatei können die einzelnen Abschnitte dann mit include() eingebunden und zu einem vollständigen Array zusammengeführt werden.

2. Anwendungsverzeichnis

Im Anwendungsverzeichnis sind alle sicherheitsempfindlichen Dateien der Applikation abgelegt. Per Voreinstellung ist dies der protected-Ordner im Verzeichnis, das auch das Startscript enthält. Der Pfad zum Anwendungsverzeichnis kann in der Konfiguration über basePath angepasst werden.

Sämtliche Inhalte in diesem Verzeichnis sollten vor Zugriff über das Web geschützt werden. Beim Apache HTTP-Server erreicht man das, indem eine .htaccess-Datei mit folgendem Inhalt in diesem Verzeichnis abgelegt wird:

deny from all

3. Applikationskomponente

Über die flexible Komponenten-Architektur kann der Funktionsumfang einer Applikation einfach angepasst und erweitert werden. Die Anwendung verwaltet eine Reihe von Komponenten, von denen jede eine spezielle Aufgabe übernimmt. Die CUrlManager- und CHttpRequest-Komponenten dienen der Anwendung zum Beispiel beim Auflösen eines Requests.

In der Konfiguration kann über das components-Array für jede dieser Komponenten eingestellt werden, welche Klasse dafür verwendet werden soll und mit welchen Werten die Eigenschaften der Komponente initialisiert werden soll. Wir können z.B. für die cache-Komponente CMemCache mit mehreren Memcache-Servern konfigurieren:

array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)

Mit diesem Eintrag in components wird cache als Objekt der Klasse CMemCache definiert und dessen servers-Eigenschaft beim Erstellen des Objekts mit den angegebenen Parametern initialisiert.

Um auf eine dieser Anwendungskomponenten zuzugreifen, benutzen Sie Yii::app()->KomponentenID, wobei KomponentenID sich auf die ID der Komponente bezieht (z.B. Yii::app()->cache).

Eine Komponente kann auch deaktiviert werden, indem man bei ihr den Schlüssel enabled als false konfiguriert. In diesem Fall wird null zurückgeliefert, wenn man auf die Komponente zugreift.

Tipp: Normalerweise werden diese Komponenten erst erzeugt, wenn zum ersten mal darauf zugegriffen wird. Wird eine Komponente während eines Requests also gar nicht verwendet, gibt es auch keine Instanz davon. Selbst bei vielen konfigurierten Komponenten bleibt die Gesamtperformance so evtl. unbeeinflusst, sofern immer nur ein Teil davon eingesetzt wird. Einige Komponenten müssen aber evtl. immer erstellt werden, ganz egal, ob sie verwendet werden oder nicht (z.B. CLogRouter). Das lässt sich erreichen, indem man die Komponenten-ID in der preload-Eigenschaft ein der Konfiguration angibt.

4. Kernkomponenten einer Anwendung

Yii definiert bereits eine Reihe von Kernkomponenten für die üblichen Aufgabengebiete einer Webanwendung vor. Die request-Komponente wird z.B. für die Auflösung eines Requests und die Abfrage von Requestinformationen wie URL und Cookies verwendet. Indem man die Eigenschaftswerte dieser Kernkomponenten anpasst, lässt sich das verhalten einer Yii-Anwendung bereits in weiten Grenzen steuern.

Dies sind die Kernkomponenten, die eine CWebApplication standardmäßig vorbelegt:

5. Lebenszyklus einer Applikation

Beim Bearbeiten eines Requests durchläuft eine Anwendung diesen Zyklus:

  1. Vor-Initialisieren der Anwendung mit CApplication::preinit();

  2. Einrichten des Klassen-Autoloaders und der Fehlerbehandlung

  3. Registrieren der Kernkomponenten

  4. Laden der Konfiguration

  5. Initialisieren der Anwendung mit CApplication::init()

    • Registrieren von Behaviors
    • Laden von statischen Komponenten
  6. Auslösen des onBeginRequest-Events

  7. Bearbeiten des Benutzer-Requests:

    • Informationen zum Request sammeln
    • Einen Controller instanziieren
    • Controller ausführen
  8. Auslösen des onEndRequest-Events

$Id: basics.application.txt 3251 2011-06-01 00:24:06Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.