1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.uri.chapter">
4 <title>Zend_Uri</title>
6 <sect2 id="zend.uri.overview">
10 <classname>Zend_Uri</classname> является компонентой, которая призвана облегчить
11 работу с URI (<ulink url="http://www.w3.org/Addressing/">Uniform Resource
12 Identifiers</ulink>) и их валидацию. <classname>Zend_Uri</classname> был создан для
13 обслуживания других компонент, таких, как <classname>Zend_Http_Client</classname>,
14 но полезен и как отдельная утилита.
18 URI всегда начинаются со схемы, после которой следует двоеточие. Структура
19 для разных схем может сильно отличаться. Класс <classname>Zend_Uri</classname>
20 предоставляет фабрику (паттерн factory), которая возвращает его подклассы,
21 специализирующиеся в различных схемах. Подклассы называются
22 <classname>Zend_Uri_<scheme></classname>, где <code><scheme></code> -
23 схема в нижнем регистре, с прописной первой буквой. Исключением из этого
24 правила является HTTPS, который обрабатывается подклассом
25 <classname>Zend_Uri_Http</classname>.
29 <sect2 id="zend.uri.creation">
30 <title>Создание нового URI</title>
33 <classname>Zend_Uri</classname> будет строить с нуля новый URI, если
34 <code>Zend_Uri::factory()</code> была передана только схема.
37 <example id="zend.uri.creation.example-1">
38 <title>Создание нового URI с Zend_Uri::factory()</title>
40 <programlisting language="php"><![CDATA[
41 // Для того, чтобы создать с нуля новый URI, передайте только схему.
42 $uri = Zend_Uri::factory('http');
44 // $uri является экземпляром Zend_Uri_Http
49 Для того, чтобы создать с нуля новый URI, передайте
50 <code>Zend_Uri::factory()</code> только схему. <footnote><para>На момент
51 написания этой документации Zend_Uri поддерживает только схемы HTTP и
52 HTTPS.</para></footnote>. При передаче не поддерживаемой схемы
53 генерируется исключение <classname>Zend_Uri_Exception</classname>.
57 Если переданные схема или URI поддерживаются, то
58 <code>Zend_Uri::factory()</code> вернет свой подкласс, который
59 специализируется на данной схеме.
63 <sect2 id="zend.uri.manipulation">
64 <title>Работа с существующим URI</title>
67 Для того, чтобы работать с существующим URI, передайте его весь целиком
68 <code>Zend_Uri::factory()</code>.
71 <example id="zend.uri.manipulation.example-1">
72 <title>Работа с существующим URI через Zend_Uri::factory()</title>
74 <programlisting language="php"><![CDATA[
75 // Чтобы работать с существующим URI, передайте его как параметр
76 $uri = Zend_Uri::factory('http://www.zend.com');
78 // $uri является экземпляром Zend_Uri_Http
83 URI будет распарсен и проверен на валидность. Если он оказался невалидным,
84 то сразу же будет сгенерировано исключение
85 <classname>Zend_Uri_Exception</classname>. Иначе <code>Zend_Uri::factory()</code>
86 вернет свой подкласс, который специализируется на данной схеме.
90 <sect2 id="zend.uri.validation">
91 <title>Проверка URI</title>
94 Функция <code>Zend_Uri::check()</code> может использоваться в том случае,
95 когда нужна только проверка существующего URI.
98 <example id="zend.uri.validation.example-1">
99 <title>Проверка URI с помощью Zend_Uri::check()</title>
101 <programlisting language="php"><![CDATA[
102 // Проверка, является ли данный URI синтаксически корректным
103 $valid = Zend_Uri::check('http://uri.in.question');
105 // $valid равен TRUE при валидном URI, иначе FALSE
110 <code>Zend_Uri::check()</code> возвращает булево значение, использование
111 этой функции более удобно, чем вызов <code>Zend_Uri::factory()</code> и
115 <sect3 id="zend.uri.validation.allowunwise">
116 <title>Разрешение использования "неумных" символов в URI</title>
119 По умолчанию <classname>Zend_Uri</classname> не будет принимать
120 следующие символы, которые в спецификации определены как "неумные"
121 (unwise) и невалидные: <code>"{", "}", "|", "\", "^", "`"</code>.
122 Тем не менее, многие реализации принимают эти символы как валидные.
126 Можно заставить <classname>Zend_Uri</classname> принимать эти
127 символы путем установки 'allow_unwise' в TRUE, используя метод
128 <code>Zend_Uri::setConfig()</code>:
131 <example id="zend.uri.validation.allowunwise.example-1">
132 <title>Разрешение использования спецсимволов в URI</title>
133 <programlisting language="php"><![CDATA[
134 // Содержит символ '|'
135 // Обычно такой вызов будет возвращать 'false':
136 $valid = Zend_Uri::check('http://example.com/?q=this|that');
138 // Тем не менее, вы можете разрешить "неумные" символы
139 Zend_Uri::setConfig(array('allow_unwise' => true));
140 // будет возвращать 'true'
141 $valid = Zend_Uri::check('http://example.com/?q=this|that');
143 // Установка 'allow_unwise' обратно в FALSE
144 Zend_Uri::setConfig(array('allow_unwise' => false));
150 <code>Zend_Uri::setConfig()</code> глобально устанавливает опции
151 конфигурации. Рекомендуется сбрасывать опцию
152 'allow_unwise' в 'false', как показано в примере выше,
153 если только вы не хотите разрешить использование "неумных"
154 символов на все время во всем приложении.
160 <sect2 id="zend.uri.instance-methods">
161 <title>Общие методы экземпляров</title>
164 Каждый экземпляр подкласса <classname>Zend_Uri</classname> (например,
165 <classname>Zend_Uri_Http</classname>) имеет несколько методов,
166 полезных для работы с любыми видами URI.
169 <sect3 id="zend.uri.instance-methods.getscheme">
170 <title>Получение схемы URI</title>
173 Схема URI – часть URI, завершающаяся двоеточием. Например, схемой в
174 <code>http://www.zend.com</code> является <code>http</code>.
177 <example id="zend.uri.instance-methods.getscheme.example-1">
178 <title>Получение схемы из объекта Zend_Uri_*</title>
180 <programlisting language="php"><![CDATA[
181 $uri = Zend_Uri::factory('http://www.zend.com');
183 $scheme = $uri->getScheme(); // "http"
188 Метод экземпляра <code>getScheme()</code> возвращает схему из URI.
193 <sect3 id="zend.uri.instance-methods.geturi">
194 <title>Получение всего URI</title>
196 <example id="zend.uri.instance-methods.geturi.example-1">
197 <title>Получение всего URI из объекта Zend_Uri_*</title>
199 <programlisting language="php"><![CDATA[
200 $uri = Zend_Uri::factory('http://www.zend.com');
202 echo $uri->getUri(); // "http://www.zend.com"
207 Метод <code>getUri()</code> возвращает строковое представление всего
212 <sect3 id="zend.uri.instance-methods.valid">
213 <title>Проверка URI на валидность</title>
216 <code>Zend_Uri::factory()</code> всегда производит синтаксическую
217 проверку переданных ему URI и не будет создавать новый экземпляр
218 подкласса <classname>Zend_Uri</classname>, если данный URI не прошел проверку.
219 Тем не менее, после того, как был инстанцирован подкласс
220 <classname>Zend_Uri</classname> для нового URI или на основе уже существующего,
221 в результате манипуляций с ним этот URI может стать невалидным.
224 <example id="zend.uri.instance-methods.valid.example-1">
225 <title>Проверка объекта Zend_Uri_*</title>
227 <programlisting language="php"><![CDATA[
228 $uri = Zend_Uri::factory('http://www.zend.com');
230 $isValid = $uri->valid(); // TRUE
235 Метод <code>valid()</code> дает возможность проверить, является ли URI
236 по-прежнему валидным.