# Zend_Uri

## Обзор

`Zend_Uri` является компонентой, которая призвана облегчить работу с URI (Uniform Resource Identifiers) и их валидацию. `Zend_Uri` был создан для обслуживания других компонент, таких, как `Zend_Http_Client`, но полезен и как отдельная утилита.

URI всегда начинаются со схемы, после которой следует двоеточие. Структура для разных схем может сильно отличаться. Класс `Zend_Uri` предоставляет фабрику (паттерн factory), которая возвращает его подклассы, специализирующиеся в различных схемах. Подклассы называются `Zend_Uri_<scheme>`, где `<scheme>` - схема в нижнем регистре, с прописной первой буквой. Исключением из этого правила является HTTPS, который обрабатывается подклассом `Zend_Uri_Http`.

## Создание нового URI

`Zend_Uri` будет строить с нуля новый URI, если `Zend_Uri::factory()` была передана только схема.

### Создание нового URI с Zend_Uri::factory()

    // Для того, чтобы создать с нуля новый URI, передайте только схему.
    $uri = Zend_Uri::factory('http');

    // $uri является экземпляром Zend_Uri_Http

Для того, чтобы создать с нуля новый URI, передайте `Zend_Uri::factory()` только схему. На момент написания этой документации Zend_Uri поддерживает только схемы HTTP и HTTPS.. При передаче не поддерживаемой схемы генерируется исключение `Zend_Uri_Exception`.

Если переданные схема или URI поддерживаются, то `Zend_Uri::factory()` вернет свой подкласс, который специализируется на данной схеме.

## Работа с существующим URI

Для того, чтобы работать с существующим URI, передайте его весь целиком `Zend_Uri::factory()`.

### Работа с существующим URI через Zend_Uri::factory()

    // Чтобы работать с существующим URI, передайте его как параметр
    $uri = Zend_Uri::factory('http://www.zend.com');

    // $uri является экземпляром Zend_Uri_Http

URI будет распарсен и проверен на валидность. Если он оказался невалидным, то сразу же будет сгенерировано исключение `Zend_Uri_Exception`. Иначе `Zend_Uri::factory()` вернет свой подкласс, который специализируется на данной схеме.

## Проверка URI

Функция `Zend_Uri::check()` может использоваться в том случае, когда нужна только проверка существующего URI.

### Проверка URI с помощью Zend_Uri::check()

    // Проверка, является ли данный URI синтаксически корректным
    $valid = Zend_Uri::check('http://uri.in.question');

    // $valid равен TRUE при валидном URI, иначе FALSE

`Zend_Uri::check()` возвращает булево значение, использование этой функции более удобно, чем вызов `Zend_Uri::factory()` и отлов исключения.

### Разрешение использования "неумных" символов в URI

По умолчанию `Zend_Uri` не будет принимать следующие символы, которые в спецификации определены как "неумные" (unwise) и невалидные: `"{", "}", "|", "\", "^", "`"`. Тем не менее, многие реализации принимают эти символы как валидные.

Можно заставить `Zend_Uri` принимать эти символы путем установки 'allow_unwise' в TRUE, используя метод `Zend_Uri::setConfig()`:

#### Разрешение использования спецсимволов в URI

    // Содержит символ '|'
    // Обычно такой вызов будет возвращать 'false':
    $valid = Zend_Uri::check('http://example.com/?q=this|that');

    // Тем не менее, вы можете разрешить "неумные" символы
    Zend_Uri::setConfig(array('allow_unwise' => true));
    // будет возвращать 'true'
    $valid = Zend_Uri::check('http://example.com/?q=this|that');

    // Установка 'allow_unwise' обратно в FALSE
    Zend_Uri::setConfig(array('allow_unwise' => false));

`Zend_Uri::setConfig()` глобально устанавливает опции конфигурации. Рекомендуется сбрасывать опцию 'allow_unwise' в 'false', как показано в примере выше, если только вы не хотите разрешить использование "неумных" символов на все время во всем приложении.

## Общие методы экземпляров

Каждый экземпляр подкласса `Zend_Uri` (например, `Zend_Uri_Http`) имеет несколько методов, полезных для работы с любыми видами URI.

### Получение схемы URI

Схема URI – часть URI, завершающаяся двоеточием. Например, схемой в `http://www.zend.com` является `http`.

#### Получение схемы из объекта Zend_Uri_*

    $uri = Zend_Uri::factory('http://www.zend.com');

    $scheme = $uri->getScheme();  // "http"

Метод экземпляра `getScheme()` возвращает схему из URI.

### Получение всего URI

#### Получение всего URI из объекта Zend_Uri_*

    $uri = Zend_Uri::factory('http://www.zend.com');

    echo $uri->getUri();  // "http://www.zend.com"

Метод `getUri()` возвращает строковое представление всего URI.

### Проверка URI на валидность

`Zend_Uri::factory()` всегда производит синтаксическую проверку переданных ему URI и не будет создавать новый экземпляр подкласса `Zend_Uri`, если данный URI не прошел проверку. Тем не менее, после того, как был инстанцирован подкласс `Zend_Uri` для нового URI или на основе уже существующего, в результате манипуляций с ним этот URI может стать невалидным.

#### Проверка объекта Zend_Uri_*

    $uri = Zend_Uri::factory('http://www.zend.com');

    $isValid = $uri->valid();  // TRUE

Метод `valid()` дает возможность проверить, является ли URI по-прежнему валидным.