Programmer's Reference Guide
| Der Front Controller |
Das Request Objekt
Einführung
Das Request Objekt ist eine einfaches Wertobjekt, das zwischen
Zend_Controller_Front und den Router, Dispatcher und Controller Klassen
übergeben wird. Es enthält sowohl die Definition des Controllers, der Aktion und der
Parameter, die an die Aktion übergeben werden sollen, als auch den Rest der
Anfrageumgebung, seit es HTTP, CLI oder PHP-GTK.
Auf den Modul Namen kann über
getModuleName()undsetModuleName()zugegriffen werden.Auf den Controller Namen kann über
getControllerName()undsetControllerName()zugegriffen werden.Auf den Namen der Aktion, die in diesem Controller aufgerufen wird, kann über accessed by
getActionName()undsetActionName()zugegriffen werden.Parameter, die von der Aktion ansprechbar sind, bestehen aus einem assoziativen Array mit Schlüssel/Wert Paaren, auf die komplett per
getParams()undsetParams()oder einzeln pergetParam()undsetParam()zugegriffen werden kann.
Abhängig vom Typ der Anfrage können auch weitere Methoden verfügbar sein. Das
verwendete Standard Request Object Zend_Controller_Request_Http stellt z.B.
Methoden zum Abfragen der Request URI, Pfadinformationen, $_GET und
$_POST Parameter usw. bereit.
Das Request Objekt wird an den Front Controller übergeben oder, wenn keines bereit gestellt wurde, am Anfang des Dispatcher Prozesses instanziert, bevor das Routing beginnt. Es wird an jedes Objekt in der Dispatcherkette übergeben.
Zusätzlich ist das Request Object besonders beim Testen sehr nützlich. Der Entwickler kann die Anfrageumgebung von Hand erstellen, inklusive Controller, Aktion, Parameter, URI usw. und das Request Objekt an den Front Controller übrgeben, um den Ablauf der Applikation zu testen. Zusammen mit dem Response Objekt sind durchdachte und genaue Unit Tests für eine MVC Applikation möglich.
HTTP Anfragen
Auf Request Daten zugreifen
Zend_Controller_Request_Http kapselt den Zugriff auf relevante Werte
wie der Schlüssel und Wert für Controller und Action Variablen des Routers und alle
zusätzlichen Parameter, die aus der URI ermittelt wurden. Es erlaubt zusätzlich
den Zugriff auf superglobale Werte als öffentliche Eigenschaften und verwaltet
die aktuelle Basis URL und Request URI. Superglobale Werte können in einem Request
Objekt nicht gesetzt werden, stattdessen verwendet man die setParam/getParam
Methoden um Benutzerparameter zu setzen oder zu erhalten.
Hinweis: Superglobale Daten
Beim Zugriff auf superglobale Daten über die öffentlichen Eigenschaften vonZend_Controller_Request_Httpist es notwendig, darauf zu achten, dass der Eigenschaftsname (der superglobale Arrayschlüssel) einem superglobalen Wert in einer bestimmten Reihenfolge entspricht: 1. GET, 2. POST, 3. COOKIE, 4. SERVER, 5. ENV.
Auf spezifische superglobale Werte kann alternativ über eine öffentliche Methode
zugegriffen werden. Zum Beispiel kann auf den unverarbeitete Wert von
$_POST['user'] durch Aufruf der getPost('user') Methode
des Request Objekts zugegriffen werden. Diese beinhalten getQuery(),
um $_GET Elemente zu erhalten und getHeader(), um
Request Header zu erhalten.
Hinweis: GET und POST Daten
Vorsicht wenn auf Daten von einem Anfrage Objekt zugegriffen wird da diese in keiner Weise gefiltert werden. Der Router und Dispatcher prüfen und filtern Daten für die Verwendung innerhalb Ihrer Aufgabe, lassen diese Daten aber unangetastet im Anfrage Objekt.
Hinweis: Empfangen der rohen POST Daten!
Mit 1.5.0 können auch die rohen Post Daten über diegetRawBody()Methode empfangen werden. Diese Methode gibt false zurück wenn keine Daten auf diesem Weg übermittelt wurden, andernfalls den kompletten Inhalt von Post.
Das ist grundsätzlich sinnvoll um Inhalt zu akzeptieren wenn eine RESTvolle MVC Anwendung entwickelt wird.
Es können auch Benutzerparameter im Anfrage Objekt gesetzt werden durch Verwendung von
setParam() und empfangen derselben später durch verwenden von getParam().
Der Router verwendet diese Funktionalität um passende Parameter in der Anfrage URI im Anfrage
Objekt zu setzen.
Hinweis: getParam() empfängt mehr als Benutzer Parameter
Um einiges Ihrer Arbeit zu tun, empfängtgetParam()von verschiedenen Quellen. Je nach Priorität enthalten diese: Benutzer Parameter die übersetParam()gesetzt wurden,GETParameter, und letztendlichPOSTParameter. Aufpassen vor dem Durchlaufen von Daten mit dieser Methode.
Wenn man nur Parameter erhalten will die vorher mitsetParam()gesetzt wurden, mußgetUserParam()verwendet werden.
Zusätzlich, sein 1.5.0, kann gesperrt werden welche Quellparameter gesucht werden.setParamSources()erlaubt es ein leeres Array zu spezifizieren oder ein Array mit einem oder mehreren Werten von '_GET' oder '_POST' um zu zeigen welche Quellparameter erlaubt sind (standardmäßig sind beide erlaubt); Wenn der Zugriff nur auf '_GET' beschränkt werden soll mußsetParamSources(array('_GET'))spezifiziert werden.
Hinweis: Apache Quirks
Wenn Apache's 404 Handler verwendet wird um eingehende Anfragen an den Front Controller zu übergeben, oder ein PT Flag mit Rewrite Regeln verwendet wird, enthält$_SERVER['REDIRECT_URL']die URI die benötigt wird, nicht$_SERVER['REQUEST_URI']. Wenn so ein Setup verwendet wird und man ungültige Routen erhält, sollte man stattdessen dieZend_Controller_Request_Apache404Klasse statt der standard Http Klasse für das Anfrage Objekt verwenden:
Diese Klasse erweitert die$request = new Zend_Controller_Request_Apache404(); $front->setRequest($request);Zend_Controller_Request_HttpKlasse und modifiziert einfach die automatische Entdeckung der Anfrage URI. Sie kann als einfache Ersetzung verwendet werden.
Basis Url und Unterverzeichnisse
Zend_Controller_Request_Http erlaubt, dass Zend_Controller_Router_Rewrite
in einem Unterverzeichnis verwendet werden kann. Zend_Controller_Request_Http
versucht, die Basis URL automatisch zu erkennen und entsprechend zu setzen.
Wenn man zum Beispiel seine index.php in einem Webserverunterverzeichnis
mit Namen /projects/myapp/index.php verwendet, sollte die Basis URL
(die Rewrite Basis) auf /projects/myapp gesetzt werden. Dieser String
wird dann vom Anfang des Pfades entfernt, bevor irgend welche Routingtreffer
ermittelt werden. Dies befreit einem davon, es an den Anfang jeder Route setzen zu
müssen. Eine Route 'user/:username' passt auf URIs wie
http://localhost/projects/myapp/user/martel und
http://example.com/user/martel.
Hinweis: URL Erkennung beachtet Groß- und Kleinschreibung
Die automatische Erkennung der Basis URL beachtet die Groß- und Kleinschreibung, weshalb man sicherstellen sollte, dass die URL einem Unterverzeichnis im Dateisystem entspricht (sogar auf einem Windows Rechner). Andernfalls wird eine Ausnahme geworfen.
Sollte die Basis URL falsch erkannt werden, kann man diese auch mit einem eigenen
Pfad mit Hilfe der setBaseUrl() Methode der
Zend_Controller_Request_Http Klasse oder der
Zend_Controller_Front Klasse überschreiben. Die einfachste Methode ist
die von Zend_Controller_Front, welche es an das Request Object weiter
leitet. Beispiel, um eine eigene Basis URL zu setzen:
/**
* Dispatch Anfrage mit einer kunden basierenden URL mit Zend_Controller_Front.
*/
$router = new Zend_Controller_Router_Rewrite();
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('./application/controllers')
->setRouter($router)
->setBaseUrl('/projects/myapp'); // Setze die Basis URL!
$response = $controller->dispatch();
Erkennen der Anfrage Methode
getMethod() erlaubt es die HTTP Anfrage Methode zu erkennen die
verwendet wurde um die aktuelle Ressource anzufragen. Zusätzlich existiert eine
Vielzahl von Methoden die es erlauben boolsche Antworten zu erhalten wenn gefragt
wird ob ein spezieller Typ von Anfrage durchgeführt wurde:
isGet()isPost()isPut()isDelete()isHead()isOptions()
Der grundsätzliche Verwendungszweck hierfür ist die Erstellung von RESTvollen MVC Architekturen.
Erkennen von AJAX Anfragen
Zend_Controller_Request_Http hat eine rudimentäre Methode für die Erkennung von
AJAX Anfragen: isXmlHttpRequest(). Diese Methode sucht nach einem HTTP Anfrageheader
X-Requested-With mit dem Wert 'XMLHttpRequest'; wenn er gefunden wird, gibt er
true zurück.
Aktuell wird dieser Header standardmäßig mit den folgenden JS Bibliotheken geschickt:
Prototype/Scriptaculous (und von Prototype abgeleitete Bibliotheken)
Yahoo! UI Library
jQuery
MochiKit
Die meisten AJAX Bibliotheken erlauben das senden von eigenen HTTP Anfrageheadern; wenn die
eigene Bibliothek diesen Header nicht sendet, muß dieser einfach and Anfrageheader hinzugefügt
werden um sicherzustellen das die isXmlHttpRequest() Methode funktioniert.
Vererben des Anfrage Objektes
Die Basis Anfrage Klasse die für alle Anfrage Objekte verwendet wird ist die abstrakte Klasse
Zend_Controller_Request_Abstract. Sie ist sehr grundsätzlich und definiert die folgenden
Methoden:
abstract class Zend_Controller_Request_Abstract
{
/**
* @return string
*/
public function getControllerName();
/**
* @param string $value
* @return self
*/
public function setControllerName($value);
/**
* @return string
*/
public function getActionName();
/**
* @param string $value
* @return self
*/
public function setActionName($value);
/**
* @return string
*/
public function getControllerKey();
/**
* @param string $key
* @return self
*/
public function setControllerKey($key);
/**
* @return string
*/
public function getActionKey();
/**
* @param string $key
* @return self
*/
public function setActionKey($key);
/**
* @param string $key
* @return mixed
*/
public function getParam($key);
/**
* @param string $key
* @param mixed $value
* @return self
*/
public function setParam($key, $value);
/**
* @return array
*/
public function getParams();
/**
* @param array $array
* @return self
*/
public function setParams(array $array);
/**
* @param boolean $flag
* @return self
*/
public function setDispatched($flag = true);
/**
* @return boolean
*/
public function isDispatched();
}
Das Anfrage Objekt ist ein Behälter für die Anfrage Umgebung. Die Controller Kette muß wirklich nur wissen wie der Controller, die Aktion, die optionalen Parameter und der Dispatched Status gesetzt und empfangen werden können. Standardmäßig durchsucht das Anfrage Objekt die eigenen Parameter indem es den Controller oder die Aktions Schlüssel verwendet um den Controller und die Aktion zu ermitteln.
Erweitere diese Klasse, oder eine Ihrer Derivate, wenn die Anfrage Klasse mit einer speziellen Umgebung interagieren soll, um Daten für die obigen Aufgaben zu erhalten. Beispiele beinhalten die HTTP Umgebung, eine CLI Umgebung, oder eine PHP-GTK Umgebung.
| Der Front Controller |
Select a Version
Languages Available
Components
Search the Manual
Navigation
- Programmierer Referenzhandbuch
- Programmierer Referenzhandbuch
- Zend_Controller
- Zend_Controller Schnellstart
- Zend_Controller Grundlagen
- Der Front Controller
- Das Request Objekt
- Der Standard Router
- Der Dispatcher
- Action Kontroller
- Action Helfer
- Das Response Objekt
- Plugins
- Eine konventionelle modulare Verzeichnis Struktur verwenden
- MVC Ausnahmen
- Migration von vorhergehenden Versionen
