Das Request ObjektEinfü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() und
setModuleName() zugegriffen werden.
Auf den Controller Namen kann über getControllerName() und
setControllerName() zugegriffen werden.
Auf den Namen der Aktion, die in diesem Controller aufgerufen wird, kann über
accessed by getActionName() und
setActionName() zugegriffen werden.
Parameter, die von der Aktion ansprechbar sind, bestehen aus einem assoziativen
Array mit Schlüssel und Werte Paaren, auf die komplett per
getParams() und setParams() oder
einzeln per getParam() und
setParam() 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 AnfragenAuf Request Daten zugreifenZend_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() und getParam()
Methoden um Benutzerparameter zu setzen oder zu erhalten.
Superglobale Daten
Beim Zugriff auf superglobale Daten über die öffentlichen Eigenschaften von
Zend_Controller_Request_Http ist 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.
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.
Empfangen der rohen POST Daten!
Mit 1.5.0 können auch die rohen Post Daten über die
getRawBody() 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.
getParam() empfängt mehr als Benutzer Parameter
Um einiges Ihrer Arbeit zu tun, empfängt getParam()
von verschiedenen Quellen. Je nach Priorität enthalten diese: Benutzer
Parameter die über setParam() gesetzt wurden,
GET Parameter, und letztendlich POST
Parameter. Aufpassen vor dem Durchlaufen von Daten mit dieser Methode.
Wenn man nur Parameter erhalten will die vorher mit
setParam() 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.
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 die
Zend_Controller_Request_Apache404 Klasse statt der
standard Http Klasse für das Anfrage Objekt verwenden:
setRequest($request);
]]>
Diese Klasse erweitert die Zend_Controller_Request_Http
Klasse und modifiziert einfach die automatische Entdeckung der Anfrage
URI. Sie kann als einfache Ersetzung verwendet werden.
Basis Url und UnterverzeichnisseZend_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.
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:
setControllerDirectory('./application/controllers')
->setRouter($router)
->setBaseUrl('/projects/myapp'); // Setze die Basis URL!
$response = $controller->dispatch();
]]>Erkennen der Anfrage MethodegetMethod() 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 AnfragenZend_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 und Scriptaculous (und von Prototype abgeleitete Bibliotheken)
Yahoo! UI LibraryjQueryMochiKit
Die meisten AJAX Bibliotheken erlauben das Senden von eigenen
HTTP Anfrageheadern; wenn die eigene Bibliothek diesen Header
nicht sendet, muß dieser einfach beim 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:
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.