Содержание


Uri


Uri, ZF2, Zend Framework 2, ЗФ2, УРИ, адрес



Обзор

Zend\Uri является компонентом, который помогает в манипулировании и проверке URI. Главная его роль это обслуживание других компонентов, таких как Zend\Http\ и другие, но бывает полезно и удобно использовать и самостоятельно.

Идентификаторы URI всегда начинаются со схемы а потом следует двоиточее. Конструкции различных схем различаются. Zend\Uri предоставляет Zend\Uri\UriFactory, который возвращает реализующий интерфейс Zend\Uri\UriInterface, специализирующийся на схемах.

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

Zend\Uri\UriFactoryсоздает новый URI с нуля, если схема передается в Zend\Uri\UriFactory::factory().

Создание нового URI  с помощью Zend\Uri\UriFactory::factory()

// To create a new URI from scratch, pass only the scheme
// followed by a colon.
$uri = Zend\Uri\UriFactory::factory('http:');
 
// $uri instanceof ZendUriUriInterface

Для создания нового URI с нуля, объявите схему после двоеточия. Если не будет обнаружен класс отвечающий за схему то вызовется исключение Zend\Uri\Exception\InvalidArgumentException.

Создание нового пользовательского класса URI

Вы можете создать свой класс, который будете использовать в Zend\Uri\UriFactory. Для этого нужно зарегистрировать класс с помощью \Zend\Uri\UriFactory::registerScheme(). Имя пользовательского класса передается в первом параметре. Во втором параметре необходимо передать имя класса, реализующего Zend\Uri\UriInterface. Этот класс должен быть ли уже загружен вручную либо должна быть вохможность подгрузить его с помощью автозагрузчика.

Пример:

// Create a new 'ftp' URI based on a custom class
use Zend\Uri\UriFactory
 
UriFactory::registerScheme('ftp', 'My\Namespace\MyClass');
 
$ftpUri = Uri\Factory::factory(
    'ftp://user@ftp.example.com/path/file'
);
 
// $ftpUri is an instance of MyLibraryMyClass, which implements
// ZendUriUriInterface

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

Для этого необходимо передать необходимый URI как параметр в ZendUriUriFactory::factory() :

// To manipulate an existing URI, pass it in.
$uri = Zend\Uri\UriFactory::factory('http://www.zend.com');
 
// $uri instanceof ZendUriUriInterface

Переданный URI будет обработан и проверен на валидность. Если же он будет не валиден вызовется исключение Zend\Uri\Exception\InvalidArgumentException. Если же валиден, то вызовется класс реализующий  Zend\UriUriInterface для дальнейшей работы с URI.

Общие методы

Zend\UriUriInterface определяет несколько методов для работы с любыми URI.

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

Например схемой адреса «http://johndoe@example.com/my/path?query#token» будет «http» :

$uri = Zend\Uri\UriFactory::factory('mailto:john.doe@example.com');
 
$scheme = $uri->getScheme();  // "mailto"

getScheme() – возвращает только схему адреса.

Получение Userinfo из URI

Userinfo -  часть адреса, которая следует за наклонными чертами перед именем хоста.

Userinfo адреса «http://johndoe@example.com/my/path?query#token» будет «johndoe».

$uri = Zend\Uri\UriFactory::factory('mailto:john.doe@example.com');
 
$scheme = $uri->getUserinfo();  // "john.doe"

Получения имени хоста URI

Эта часть адреса следует после Userinfo перед частичными путями. Хост адреса «http://johndoe@example.com/my/path?query#token» будет «example.com».

$uri = Zend\Uri\UriFactory::factory('mailto:john.doe@example.com');
 
$scheme = $uri->getHost();  // "example.com"

Получение порта URI

Находиться сразу после имени хоста через двоеточие.

Порт адреса «http://johndoe@example.com:80/my/path?query#token» будет «80».

$uri = Zend\Uri\UriFactory::factory('http://example.com');
 
$scheme = $uri->getPort();  // "80"

Получение пути URI

Находиться между портом и данными GET запроса.

Путь адреса «http://johndoe@example.com:80/my/path?query#token» будет «/my/path».

$uri = Zend\Uri\UriFactory::factory('http://example.com:80/my/path?a=b&c=d#token');
 
$scheme = $uri->getPath();  // "/my/path"

Получение данных для GET запроса

Все, что находиться между знаками вопроса (?) и знака диеза (решетки, хеша, октоторпа, #). Для этого адреса «http://johndoe@example.com:80/my/path?query#token» GET запросом будет это часть «query».

$uri = Zend\Uri\UriFactory::factory('http://example.com:80/my/path?a=b&c=d#token');
 
$scheme = $uri->getQuery();  // "a=b&c=d"

Так же можно получить эти данные в виде массива:

$uri = Zend\Uri\UriFactory::factory('http://example.com:80/my/path?a=b&c=d#token');
 
$scheme = $uri->getQueryAsArray();
// array(
//  'a' => 'b',
//  'c' => 'd',
// )

Получения «якоря» URI

То что находиться после символа диеза «#».

Для этого адреса «http://johndoe@example.com:80/my/path?query#token» GET запросом будет это часть «token».

$uri = Zend\Uri\UriFactory::factory('http://example.com:80/my/path?a=b&c=d#token');
 
$scheme = $uri->getFragment();  // "token"

Получение всего (полного) URI

$uri = Zend\Uri\UriFactory::factory('http://www.zend.com');
 
echo $uri->toString();  // "http://www.zend.com"
 
// Alternate method:
echo (string) $uri;     // "http://www.zend.com"

Используя метод toString()  -  получите адрес в видее строки.

Проверка (Validating) URI

При использовании Zend\Uri\UriFactory::factory() переданный URI всегда проходит проверку. Однако, даже если новый URI был успешно создан с помощью Zend\Uri\UriInterface, он может стать не валидным после манипуляций с ним.

$uri = Zend\Uri\UriFactory::factory('http://www.zend.com');
 
$isValid = $uri->isValid();  // TRUE

Поэтому после изменений URI всегда используйте метод isValid().


Автор статьи: DuB