Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Класс Zend_Controller_RewriteRouter


PHP 5: Новые возможности.

Класс Zend_Controller_RewriteRouter представляет собой новую форму роутера (маршрутизатора). В отличие от стандартного роутера (Zend_Controller_Router), он обеспечивает более гибкий разбор запрошенного URI; в частности, поддерживает работу в поддиректориях.

С другой стороны, не будучи роутером по умолчанию, Zend_Controller_RewriteRouter требует определенного количества дополнительных «ручных» операций, которые при использовании стандартного роутера остаются «за сценой».

Для лучшего понимания изложенного далее материала вспомним, что в задачу роутера входит разбиение запрошенного URI на составные части и упаковка их в объект Zend_Controller_Dispatcher_Token (см. «Роутинг»).

Использование роутера Zend_Controller_RewriteRouter требует выполнения следующих шагов (Пример 9.1, «Использование Zend_Controller_RewriteRouter»).

  1. Создание роутера.

  2. Добавление маршрута (route).

  3. Внедрение в контроллер.

Пример 9.1. Использование Zend_Controller_RewriteRouter

<?php

$router = new Zend_Controller_RewriteRouter(); 1

$router->addRoute('user', 'user/:username',
                  array('controller' => 'user', 'action' => 'info')); 2

$controller = Zend_Controller_Front::getInstance(); 3
$controller->setRouter($router); 4

?>
            
1

Создает новый роутер.

2

Добавляет определенный пользователем маршрут, определяющий правила разбора URI.

3

Получаем ссылку на экземпляр главного контроллера.

4

Устанавливаем роутер, который будет использоваться контроллером.


Операция по добавлению маршрута определенно нуждается в дополнительных разъяснениях, чем мы сейчас и займемся.

Важнейшей частью Zend_Controller_RewriteRouter являются определенные пользователем маршруты. Они создаются путем вызова метода addRoute(), которому может быть передано до четырех параметров. Обязательными являются первые два параметра.

$router->addRoute('user', 'user/:username');

Первый параметр служит названием маршрута и в настоящее время не используется. Второй параметр представляет собой шаблон для разбора запрошенного адреса. В приведенном примере маршрут, в частности, мог бы быть использован для разбора адреса http://www.example.com/user/pterodactyl/. Иначе говоря, шаблон задает правила для первых двух значащих токенов: первый из них задан явным образом и совпадает с названием маршрута; значение второго будет присвоено переменной username (о том, что это переменная, свидетельствует предшествующее двоеточие) - его впоследствии можно будет извлечь с помощью метода Zend_Controller_Action::_getParam().

Таким образом, можно заметить, что Zend_Controller_RewriteRouter не привязан жестко к стандартной схеме «контроллер/действие». Тем не менее, поддержка этой схемы также может быть задана при помощи следующей конструкции.

$router->addRoute('user', ':controller/:action');

Так или иначе, но контроллером по умолчанию является IndexController. Именно ему будет передано управление, если контроллер не будет задан иным способом. Что касается действия, то оно должно быть задано либо в адресе, либо по умолчанию. Если не задан ни контроллер, ни действие, будет вызван метод IndexController::noRouteAction().

Необязательный третий параметр метода addRoute() может быть использован для задания значений переменных по умолчанию. Этот параметр представляет собой ассоциативный массив.

$router->addRoute('archive', 'archive/:year', array('year' => 2006));

При обработке адреса http://www.example.com/archive/2005/ значение переменной year окажется равным 2005. Менее очевидно, что при отсутствии указания года в адресе (http://www.example.com/archive/) эта переменная, тем не менее, будет установлена по умолчанию (2006).

[Подсказка]Подсказка

В реальном приложении следует установить также значения по умолчанию для контроллера и действия, например, как это показано ниже.

$router->addRoute('archive', 'archive/:year',
                  array('year' => 2006, 'controller' => 'archive',
                        'action' => 'show'));
            

В этом случае будет вызван метод ArchiveController::showAction(), а значение параметра year будет равно 2006.

Необязательный четвертый параметр (в виде регулярного выражения) может задавать требования к значениям переменных.

$router->addRoute('archive', 'archive/:year',
                  array('year' => 2006), array('year' => '\d{4}'));
        

В данном случае заданное в адресе значение года будет проверяться на совпадение с заданным шаблоном (четыре цифры). Если такое совпадение не будет обнаружено, переменной будет присвоено значение по умолчанию (если, конечно, оно было задано).

Важным преимуществом Zend_Controller_RewriteRouter явдяется его способность работать в поддиректориях сайта (в то время как стандартный роутер работает только в корневой директории).

Например, если главный контроллер будет расположен в файле /foo/bar/index.php то базовый адрес будет автоматически распознан и установлен как /foo/bar. Тем самым, оба эти токена будут исключены из числа значащих. Скажем, адрес http://www.example.com/foo/bar/user/pterodactyl/ в данном случае окажется эквивалентным адресу http://www.example.com/user/pterodactyl/ (если последний использовать файл /index.php).

[Подсказка]Подсказка

Базовый адрес может быть также установлен принудительно с помощью метода setRewriteBase(). Впрочем, обычно необходимости в этом не возникает.

$router->setRewriteBase('/foo/bar');

Created with DocBook


В избранное