# Zend_Uri

## Überblick

`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.

## Eine neue URI erstellen

`Zend_Uri` erstellt eine neue URI von Grund auf, wenn nur das Schema an `Zend_Uri::factory()` übergeben wurde.

### 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()` Zum Zeitpunkt des Schreiben unterstützt `Zend_Uri` nur HTTP und HTTPS Schemata. Wenn eine nicht unterstütztes Schema übergeben wird, 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.

## Verändern einer vorhandenen URI

Um eine vorhandene URI zu verändern, übergibt man die komplett URI an `Zend_Uri::factory()`.

### Verändern einer vorhandenen URI mit Zend_Uri::factory()

    // Um eine vorhandene URI zu verändern, übergibt man sie.
    $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.

## URI Validierung

Die `Zend_Uri::check()` Methode kann verwendet werden, wenn nur das Validieren einer vorhandenen URI benötigt wird.

### URI Validierung mit Zend_Uri::check()

    // Überprüfe, ob eine übergebe 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 ein Boolean zurück, was einfacher ist, als `Zend_Uri::factory()` zu verwenden und eine Ausnahme abzufangen.

### "Unwise" Zeichen in URIs erlauben

Standardmäßig wird `Zend_Uri` die folgenden Zeichen nicht akzepzieren, da Sie durch die RFC als "unwise" definiert und deshalb ungültig sind: `"{", "}", "|", "\", "^", "`"`. Trotzdem, akzeptieren viele Implementierungen diese Zeichen als Gültig.

`Zend_Uri` kann so eingestellt werden das es diese "unwise" Zeichen akzeptiert indem die 'allow_unwise' Option auf ein boolsches TRUE gesetzt wird, durch Verwendung der `Zend_Uri`::setConfig() Methode:

#### 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));

`Zend_Uri::setConfig()` setzt Konfigurationsoptionen global. Es wird empfohlen die 'allow_unwise' Option auf 'false' zurückzusetzen wie im obigen Beispiel, solange man unwise Zeichen immer global erlauben will.

## Allgemeine Instanzmethoden

Jede Instant 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 erhalten

Das Schema der URI ist der Teil der URI vor dem Doppelpunkt. Zum Beispiel ist `http` das Schema von `http://www.zend.com`.

#### 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.

### Die komplette URI erhalten

#### 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.

### Die URI validieren

`Zend_Uri::factory()` validiert immer jede übergebene URI und wird keine `Zend_Uri` Unterklasse instantieren, 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.

#### 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.