В предлагаемом материале рассмотрен новый маршрутизатор Zend_Controller_RewriteRouter и вопросы его использования в реальных приложениях.
Обзор
Класс
Zend_Controller_RewriteRouter представляет собой новую форму роутера (маршрутизатора). В отличие от стандартного роутера (Zend_Controller_Router), он обеспечивает более гибкий разбор запрошенного URI; в частности, поддерживает работу в поддиректориях.
С другой стороны, не будучи роутером по умолчанию, Zend_Controller_RewriteRouter требует определенного количества дополнительных «ручных» операций, которые при использовании стандартного роутера остаются «за сценой».
Для лучшего понимания изложенного далее материала вспомним, что в задачу роутера входит разбиение запрошенного URI на составные части и упаковка их в объект Zend_Controller_Dispatcher_Token (см. «Роутинг»).
Добавляет определенный пользователем маршрут, определяющий правила разбора URI.
Получаем ссылку на экземпляр главного контроллера.
Устанавливаем роутер, который будет использоваться контроллером.
Операция по добавлению маршрута определенно нуждается в дополнительных разъяснениях, чем мы сейчас и займемся.
Базовый маршрут
Важнейшей частью 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() может быть использован для задания значений переменных по умолчанию. Этот параметр представляет собой ассоциативный массив.
При обработке адреса http://www.example.com/archive/2005/ значение переменной year окажется равным 2005. Менее очевидно, что при отсутствии указания года
в адресе (http://www.example.com/archive/) эта переменная, тем не менее, будет установлена по умолчанию (2006).
Подсказка
В реальном приложении следует установить также значения по
умолчанию для контроллера и действия, например, как это показано ниже.
В данном случае заданное в адресе значение года будет проверяться на совпадение с заданным шаблоном (четыре цифры). Если такое совпадение не будет обнаружено, переменной будет присвоено значение по умолчанию (если, конечно, оно было задано).
Базовый адрес и поддиректории
Важным преимуществом 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');
Маршруты по умолчанию
Класс Zend_Controller_RewriteRouter поддерживает два маршрута по умолчанию. Первый маршрут привязывает к корневому адресу
IndexController и indexAction().