Zend\Uri является компонентом, который помогает в манипулировании и проверке URI. Главная его роль это обслуживание других компонентов, таких как Zend\Http\ и другие, но бывает полезно и удобно использовать и самостоятельно.
Идентификаторы URI всегда начинаются со схемы а потом следует двоиточее. Конструкции различных схем различаются. Zend\Uri предоставляет Zend\Uri\UriFactory, который возвращает реализующий интерфейс Zend\Uri\UriInterface, специализирующийся на схемах.
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 как параметр в 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.
Например схемой адреса «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 - часть адреса, которая следует за наклонными чертами перед именем хоста.
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"
Эта часть адреса следует после 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"
Находиться сразу после имени хоста через двоеточие.
Порт адреса «http://johndoe@example.com:80/my/path?query#token» будет «80».
$uri = Zend\Uri\UriFactory::factory('http://example.com'); $scheme = $uri->getPort(); // "80"
Находиться между портом и данными 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', // )
То что находиться после символа диеза «#».
Для этого адреса «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 = 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() - получите адрес в видее строки.
При использовании Zend\Uri\UriFactory::factory() переданный URI всегда проходит проверку. Однако, даже если новый URI был успешно создан с помощью Zend\Uri\UriInterface, он может стать не валидным после манипуляций с ним.
$uri = Zend\Uri\UriFactory::factory('http://www.zend.com'); $isValid = $uri->isValid(); // TRUE
Поэтому после изменений URI всегда используйте метод isValid().