Zend_Controller_Router_Route
Zend_Controller_Router_Route - стандартный маршрут
фреймворка. Он сочетает в себе легкость использования и гибкость
определения маршрутов. Каждый маршрут состоит в основном из карты URL
(статических и динамических частей (переменных)), и может быть
инициализирован со значениями по умолчанию и требованиями к переменным.
Давайте представим себе некое приложение, в котором нужно разместить
несколько информационных страниц об авторах. Мы хотим, чтобы адрес
http://domain.com/author/martel вел
на страницу с информацией об авторе с именем "martel". Маршрут для
обеспечения такой функциональности может выглядеть следующим образом:
'profile',
'action' => 'userinfo'
)
);
$router->addRoute('user', $route);
]]>
Первый параметр конструктора Zend_Controller_Router_Route -
определение маршрута, которое будет сопоставляться с URL. Определения
маршрутов содержат статические и динамические части, разделенные
символом косой черты ('/'). Статические части являются обычным текстом:
author. Динамические части, называемые переменными,
помечаются знаком двоеточия в начале имени переменной:
:username.
Использование символов
Текущая реализация позволяет использовать любые (за исключением
косой черты) символы в идентификаторе переменной,
но сильно рекомендуется использовать в них только символы,
допустимые для переменных в php. Есть вероятность, что в
будущем реализация изменится, и это может вызвать скрытые ошибки в
вашем коде.
Этот маршрут должен сработать, когда вы вводите
http://domain.com/author/martel в своем броузере, в этом
случае все его переменные будут добавлены в объект
Zend_Controller_Request и будут доступны в вашем
контроллере ProfileController.
Переменные, возвращаемые в этом примере, могут быть представленые в виде
следующего массива пар ключ/значение:
'martel',
'controller' => 'profile',
'action' => 'userinfo'
);
]]>
Затем Zend_Controller_Dispatcher_Standard должен вызвать
метод userinfoAction() вашего класса
ProfileController (используется модуль по умолчанию),
основываясь на этих значениях. Вы сможете получать эти переменные через
методы Zend_Controller_Action::_getParam() или
Zend_Controller_Request::getParam().
getRequest();
$username = $request->getParam('username');
$username = $this->_getParam('username');
}
]]>
Определение маршрута может содержать в себе еще один специальный символ
(метасимвол), представленный символом '*'. Он используется для сбора
параметров, как в маршруте Module, используемом по умолчанию
(пары переменная => значение, определенные в URI). Следующий маршрут
приближенно воспроизводит поведение маршрута Module:
'default')
);
$router->addRoute('default', $route);
]]>
Значения переменных по умолчанию
Любая переменная в маршруте может иметь значение по умолчанию, для
этого используется второй параметр конструктора
Zend_Controller_Router_Route. Этот параметр является
массивом с ключами, представляющими имена переменных, и со
значениями в качестве значений переменных по умолчанию:
2006)
);
$router->addRoute('archive', $route);
]]>
Маршрут выше будет соответствовать URL-ам
http://domain.com/archive/2005 и
http://example.com/archive. В последнем случае
переменная year будет иметь начальное значение по умолчанию 2006.
В этом примере переменная year будет добавлена в объект запроса.
Поскольку не была предоставлена информация для маршрутизации (не
определены параметры controller и action), то управление будет
передано контроллеру и методу действия, используемым по умолчанию
(оба определены в Zend_Controller_Dispatcher_Abstract).
Для того, чтобы сделать этот пример более полезным, нужно
передать действительные контроллер и действие в качестве значений по
умолчанию:
2006,
'controller' => 'archive',
'action' => 'show'
)
);
$router->addRoute('archive', $route);
]]>
В результате будет вызван метод showAction() класса
ArchiveController.
Требования к переменным
Можно передать конструктору
Zend_Controller_Router_Route третий параметр, в котором
установлены требования к переменным. Они определяются как части
регулярных выражений:
2006,
'controller' => 'archive',
'action' => 'show'
),
array('year' => '\d+')
);
$router->addRoute('archive', $route);
]]>
В случае маршрута, определенного таким образом, маршрутизатор будет
считать URL соответствующим ему только если переменная year
содержит числовые данные - например,
http://domain.com/archive/2345. URL вида
http://example.com/archive/test не будет
соответствовать этому маршруту, вместо этого будет произведен
переход к следующему маршруту в цепочке.