Um den Zugriff auf bestimmte HTTP-Informationen, Überprüfungsfunktionen und einzelne Schlüssel des $_SERVER-Arrays zu erleichtern und übersichtlicher zu machen, habe ich eine kleine statische HTTP-Klasse geschrieben, die diese Dinge ermöglicht. Die Klasse ersetzt vollständig den Zugriff über $_SERVER für bestimmte HTTP-Informationen.
Auf die Request-Parameter kann ebenfalls zugegriffen werden, womit $_GET, $_POST und $_FILES wegfallen. Außerdem werden die $_GET- und $_POST-Daten automatisch mit trim() bearbeitet, so dass eine erneute Trimmung vor dem Eintragen in die Datenbank oder der Überprüfung durch strlen wegfällt.
Die HTTP-Klasse: Methoden- und Parameterinformationen
Zuerst einmal der Aufbau der Klasse und die Methodenstruktur.
| Methode | Beschreibung |
|---|---|
public static init() |
Initialisiert die internen Klassen-Eigenschaften $GET, $POST und $FILES. |
public static issetGetValues(array $keys) |
Prüft, ob alle GET-Schlüssel aus $array gesetzt sind. |
public static issetPostValues(array $keys) |
Prüft, ob alle POST-Schlüssel aus $array gesetzt sind. |
public static requestMethod([optional] string $method) |
Gibt die Request-Methode zurück oder prüft diese. |
public static responseStatus([optional] int $code) |
Sendet einen HTTP-Statuscode an den Client oder fragt ihn ab. |
public static redirect(string $url, [optional] int $code) |
Sendet einen HTTP-Redirect mit Statuscode an den Client. |
public static requestURI() |
Gibt die relativ aufgerufene URL zurück. |
public static useragent() |
Gibt den Inhalt aus dem HTTP-Headerfeld User-Agent zurück (falls übermittelt). |
public static referer() |
Gibt den Inhalt aus dem HTTP-Headerfeld Referer zurück (falls übermittelt). |
Die Klasse ist komplett statisch, das heißt, dass sie nicht instanziert werden muss und somit auch kein Konstruktor ausgeführt wird. Deshalb ist es ganz wichtig, dass vor dem Zugriff auf eine der drei Eigenschaften $GET, $POST oder $FILES die init-Methode einmal aufgerufen wird, damit die Klasseneigenschaften, die standardmäßig auf NULL stehen, mit Inhalt befüllt, oder anders gesagt initialisiert werden.
Die Anfragemethode mit requestMethod ermitteln oder prüfen
Die Methode requestMethod gibt die Request-Methode zurück, mit der der Webserver angefragt wurde. Das könnte zum Beispiel GET, POST oder HEAD sein. Wenn man aber einen Parameter übergibt, dann ändert sich das Ganze:
Jetzt prüft die Methode nämlich, ob die Request-Methode gleich dem String ist, der als Parameter übergeben wurde. Das ist zum Beispiel viel übersichtlicher innerhalb einer if-Abfrage, wenn man prüfen möchte, ob da eventuell ein POST-Request vorliegt und noch Daten kommen.
Request-Methode ausgeben:
#==================
# Standardverfahren
#==================
echo 'Die Request-Method ist: '.$_SERVER['REQUEST_METHOD'];
#================
# Mit HTTP-Klasse
#================
echo 'Die Request-Method ist: '.HTTP::requestMethod();
Request-Methode überprüfen:
#==================
# Standardverfahren
#==================
if($_SERVER['REQUEST_METHOD'] == 'POST') { /* [...] */ }
#================
# Mit HTTP-Klasse
#================
if(HTTP::requestMethod('POST')) { /* [...] */ }
Die aufgerufene URL mit requestURI ermitteln
Die Methode requestURI() ermittelt die vom Webserver angefragte relative URL (ohne vorangestellten Hostnamen).
#==================
# Standardverfahren
#==================
echo 'Die aufgerufene URL ist: '.$_SERVER['REQUEST_URI'];
#================
# Mit HTTP-Klasse
#================
echo 'Die aufgerufene URL ist: '.HTTP::requestURI();
Zugriff auf die $_GET-, $_POST- oder $_FILES-Parameter
Vor dem Zugriff muss die init-Methode einmal ausgeführt worden sein. Erst dann kann man ganz normal auf die Parameter zugreifen. Das Folgende geht natürlich genau so auch bei einer GET-Anfrage und einem GET-Parameter. Dann einfach HTTP::$POST durch HTTP::$GET ersetzen, und schon hat man Zugriff auf die GET-Parameter.
#==================
# Standardverfahren
#==================
if($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_POST['param'])) {
echo 'Der POST-Parameter ist: '.$_POST['param'];
}
#================
# Mit HTTP-Klasse
#================
if(HTTP::requestMethod('POST') AND isset(HTTP::$POST['param'])) {
echo 'Der POST-Parameter ist: '.HTTP::$POST['param'];
}
Pro-Tipp: Mit $_FILES geht das natürlich genauso. 😎
HTTP-Statuscodes oder Weiterleitungen senden
Mit den Methoden responseStatus und redirect kann man Statuscodes an den Client senden und Weiterleitungen setzen. An die Methode responseStatus muss einfach nur ein Parameter vom Typ int mit dem entsprechenden HTTP-Statuscode übergeben werden. Andernfalls gibt die Methode den aktuellen HTTP-Statuscode der Anfrage zurück.
Wenn man den Benutzer weiterleiten möchte, dann nutzt man die redirect-Methode und übergibt als ersten Parameter die Ziel-URL und optional als zweiten Parameter einen Statuscode für die Weiterleitung. Standardmäßig wird der Statuscode 303 See Other gesendet, der in der Regel ausreicht.
#=========================================================================
# HTTP-Statuscode 503 Service Temporarily Unavailable an den Client senden
#=========================================================================
HTTP::sendstatus(503);
#================================================================
# HTTP-Weiterleitung mit und ohne Statuscode an den Client senden
#================================================================
HTTP::redirect('http://menzerath.eu/'); # Standard: 303-Redirect
HTTP::redirect('http://blackphantom.de/', 301); # 301-Redirect
Prüfen, ob diverse GET- oder POST-Parameter gesetzt sind
Mit den beiden Methoden issetGetValues und issetPostValues kann man jeweils überprüfen, ob bestimmte GET- oder POST-Parameter gesetzt sind. Dazu erwarten die beiden Methoden als ersten und einzigen Parameter ein Array mit den Schlüsselnamen, die gesetzt sein müssen. Danach durchläuft eine foreach-Schleife das Array. Wenn alle Parameter gesetzt sind, wird TRUE zurückgegeben, ansonsten FALSE.
#==========================================================
# Prüfen, ob bestimmte GET- und POST-Parameter gesetzt sind
#==========================================================
if(HTTP::issetGetValues (['param1', 'param2', 'param3', 'param4'])) { /* ... */ }
if(HTTP::issetPostValues(['param1', 'param2', 'param3', 'param4'])) { /* ... */ }
Abschließende Informationen
Die restlichen Methoden sollten selbsterklärend sein. Wer nicht alle Methoden gebrauchen kann, der kann die entsprechenden Methoden natürlich gerne aus der Klasse verbannen.
Hier ist noch das Git-Repository mit der Klasse. Dieses beinhaltet auch immer die aktuellste Version!