Zend_Uri
ist eine Komponente, die das Verändern und Validieren
von Uniform Resource Identifiers
(URIs) unterstützt. Zend_Uri
existiert hauptsächlich, um andere
Komponenten wie z.B. Zend_Http_Client
zu unterstützen, aber ist
auch als eigenständiges Hilfsmittel nützlich.
URIs beginnen immer mit einem Schema, gefolgt von einem Doppelpunkt.
Der Aufbau der vielen unterschiedlichen Schemata unterscheidet sich erheblich. Die
Zend_Uri
stellt eine Fabrik (Factory) bereit, die eine
Unterklasse von sich selber zurück gibt, die auf das entsprechende Schema spezialisiert
ist. Diese Unterklasse heißt Zend_Uri_<scheme>
, wobei
<scheme> das Schema in Kleinbuchstaben mit einem
Großbuchstaben am Anfang darstellt. Eine Ausnahme dieser Regel ist
HTTPS, das auch von Zend_Uri_Http
verarbeitet
wird.
Zend_Uri
erstellt eine neue URI von Grund auf,
wenn nur das Schema an Zend_Uri::factory()
übergeben wurde.
Beispiel 923. Erstellen einer neuen URI mit Zend_Uri::factory()
// Um eine neue URI von Grund auf zu erstellen, übergebe nur das Schema $uri = Zend_Uri::factory('http'); // $uri instanceof Zend_Uri_Http
Um eine neue URI von Grund auf zu erstellen, übergibt man nur das
Schema an Zend_Uri::factory()
[31]. Wenn
ein nicht unterstütztes Schema übergeben, und keine Schema-spezifische Klasse angegeben
wird, dann wird eine Zend_Uri_Exception
ausgeworfen.
Wenn das Schema oder die übergebene URI unterstützt wird, gibt
Zend_Uri::factory()
eine Unterklasse von sich selbst zurück,
die auf das zu erstellende Schema spezialisiert ist.
Beginnend mit Zend Framework 1.10.5 kann man eine eigene Klasse spezifizieren
welche, wenn Sie als zweiter Parameter der Methode
Zend_Uri::factory()
angegeben wird, verwendet wird wenn man
eine Zend_Uri Instanz erstellt. Das erlaubt es Zend_Uri zu erweitern und eigene URI
Klassen zu erstellen, und neue URI Objekte zu instanzieren basierend auf den eigenen
Klassen.
Der zweite Parameter welcher an Zend_Uri::factory()
übergeben wird muss ein String sein mit dem Namen der Klasse welche
Zend_Uri
erweitert. Diese Klasse muss entweder bereits
geladen sein, oder geladen werden können indem
Zend_Loader::loadClass()
verwendet wird - deshalb muss es
den Konventionen für Zend Framework Klassen und Dateien folgen und muss im
include_path sein.
Beispiel 924. Erstellen eine URI durch Verwendung einer eigenen Klasse
// Erstellt eine neue 'ftp' URI basierend auf einer eigenen Klasse $ftpUri = Zend_Uri::factory( 'ftp://user@ftp.example.com/path/file', 'MyLibrary_Uri_Ftp' ); // $ftpUri ist eine Instanz von MyLibrary_Uri_Ftp, welche eine Unterklasse von Zend_Uri ist
Um eine vorhandene URI zu verändern, übergibt man die komplette
URI an Zend_Uri::factory()
.
Beispiel 925. Verändern einer vorhandenen URI mit Zend_Uri::factory()
// Um eine vorhandene URI zu verändern, übergibt man diese $uri = Zend_Uri::factory('http://www.zend.com'); // $uri instanceof Zend_Uri_Http
Die URI wird analysiert und validiert. Wenn sie als ungültig erkannt
wird, wird sofort eine Zend_Uri_Exception
geworfen. Andernfalls
gibt Zend_Uri::factory()
eine Unterklasse von sich selbst
zurück, die auf das zu verändernde Schema spezialisiert ist.
Die Zend_Uri::check()
Methode kann verwendet werden, wenn nur
das Validieren einer vorhandenen URI benötigt wird.
Beispiel 926. URI Validierung mit Zend_Uri::check()
// Überprüfe, ob eine übergebene URI wohlgeformt ist $valid = Zend_Uri::check('http://uri.in.question'); // $valid ist TRUE für eine valide URI, andernfalls FALSE
Zend_Uri::check()
gibt einen Boolschen Wert zurück was bequemer
ist als Zend_Uri::factory()
zu verwenden und die Exception zu
fangen.
Standardmäßig wird Zend_Uri
die folgenden Zeichen nicht
akzepzieren: "{", "}", "|", "\", "^", "`". Diese Zeichen sind
durch die RFC als "unwise" definiert und deshalb ungültig;
trotzdem, akzeptieren viele Implementierungen diese Zeichen als gültig.
Zend_Uri
kann so eingestellt werden, dass es diese "unwise"
Zeichen akzeptiert. Hierzu muss die Option 'allow_unwise' Option durch Verwendung
von Zend_Uri::setConfig()
auf ein boolsches
TRUE
gesetzt werden:
Beispiel 927. Spezielle Zeichen in URIs erlauben
// Enthält das '|' Symbol // Normal würde das false zurückgeben: $valid = Zend_Uri::check('http://example.com/?q=this|that'); // Trotzdem kann man diese "unwise" Zeichen erlauben Zend_Uri::setConfig(array('allow_unwise' => true)); // Gibt 'true' zurück $valid = Zend_Uri::check('http://example.com/?q=this|that'); // Setzt den Wert 'allow_unwise' auf das Standardmäßige FALSE zurück Zend_Uri::setConfig(array('allow_unwise' => false));
Anmerkung
Zend_Uri::setConfig()
setzt Konfigurationsoptionen
global. Es wird, wie im obigen Beispiel, empfohlen die 'allow_unwise' Option auf
'FALSE
' zurückzusetzen, solange man unwise Zeichen immer
global erlauben will.
Jede Instanz einer Zend_Uri
Unterklasse (z.B.
Zend_Uri_Http
) hat verschiedene Instanzmethoden, die für die
Verwendung mit jeglicher URI nützlich sind.
Das Schema der URI ist der Teil der URI vor
dem Doppelpunkt. Zum Beispiel ist 'http' das Schema von
http://www.zend.com
.
Beispiel 928. Das Schema eines Zend_Uri_* Objektes erhalten
$uri = Zend_Uri::factory('http://www.zend.com'); $scheme = $uri->getScheme(); // "http"
Die getScheme()
Instanzmethode gibt nur das Schema des
URI Objektes zurück.
Beispiel 929. Die komplette URI eines Zend_Uri_* Objektes erhalten
$uri = Zend_Uri::factory('http://www.zend.com'); echo $uri->getUri(); // "http://www.zend.com"
Die getUri()
Methode gibt den String zurück, der die
komplette URI repräsentiert.
Zend_Uri::factory()
validiert immer jede übergebene
URI und wird keine Zend_Uri
Unterklasse
instanzieren, wenn die übergebene URI ungültig ist. Dennoch ist
es nach der Instanzierung der Zend_Uri
Unterklasse für eine
neue oder eine bestehende URI möglich, dass die
URI später ungültig wird, nachdem sie verändert worden ist.
Beispiel 930. Ein Zend_Uri_* Object validieren
$uri = Zend_Uri::factory('http://www.zend.com'); $isValid = $uri->valid(); // TRUE
Die valid()
Instanzmethode ermöglicht es, das
URI Objekt auf Gültigkeit zu überprüfen.
[31] Zum Zeitpunkt des
Schreibens bietet Zend_Uri
nur eingebaute Unterstützung für die
Schemata HTTP und HTTPS