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 не будет соответствовать этому маршруту, вместо этого будет произведен переход к следующему маршруту в цепочке. Переводимые сегменты Стандартный маршрут поддерживает переводимые сегменты. Для того, чтобы использовать эту возможность, нужно как минимум указать, какой переводчик (экземпляр Zend_Translate) должен использоваться - одним из следующих способов: Поместить его в реестр с ключом Zend_Translate. Установить через статический метод Zend_Controller_Router_Route::setDefaultTranslator(). Передать его конструктору в качестве четвертого параметра. По умолчанию используется локаль, указанная в экземпляре Zend_Translate. Для того, чтобы переопределить ее, вы можете установить ее значение (экземпляр Zend_Locale или строка с локалью) одним из следующих способов: Поместить ее в реестр с ключом Zend_Locale. Установить через статический метод Zend_Controller_Router_Route::setDefaultLocale(). Передать ее конструктору в качестве пятого параметра. Передать ее как параметр @locale методу assemble(). Переводимые сегменты делятся на два типа. У статических сегментов в начале ставится один символ @, они будут переведены в соответствии текущей локалью при сборке URL и преобразованы обратно в идентификатор сообщения при сопоставлении URL с маршрутом. У динамических сегментов в начале ставится :@. При сборке URL данный параметр будет переведен и результат перевода будет добавлен на его место. При сопоставлении переведенный параметр из URL будет преобразован обратно в идентификатор сообщения. Идентификаторы сообщений и отдельный языковый файл Может случайно получиться так, что идентификатор сообщения, который вы собираетесь использовать в одном из своих маршрутов, уже используется в ваших скриптах вида или где-то еще. Для того, чтобы иметь полный контроль над вашими URL-ами, следует использовать отдельный языковый файл для сообщений, используемых в маршруте. Следующий пример демонстрирует наиболее простой способ подготовки стандартного маршрута с использованием переводимых сегментов: addTranslation(array('archive' => 'archiv', 'year' => 'jahr', 'month' => 'monat', 'index' => 'uebersicht'), 'de'); // Установка текущей локали для переводчика $translator->setLocale('en'); // Установка его в качестве используемого по умолчанию для маршрутов Zend_Controller_Router_Route::setDefaultTranslator($translator); ]]> Этот пример демонстрирует использование статических сегментов: 'archive', 'action' => 'index' ) ); $router->addRoute('archive', $route); // Сборка URL в локали, используемой по умолчанию: archive $route->assemble(array()); // Сборка URL в немецкой локали: archiv $route->assemble(array()); ]]> Вы можете использовать динамические сегменты для создания переведенных версий как в случае использования маршрутов основанных на модулях: 'index', 'action' => 'index' ) ); $router->addRoute('archive', $route); // Сборка URL в локали, используемой по умолчанию: archive/index/foo/bar $route->assemble(array('controller' => 'archive', 'foo' => 'bar')); // Сборка URL в немецкой локали: archiv/uebersicht/foo/bar $route->assemble(array('controller' => 'archive', 'foo' => 'bar')); ]]> Вы можете также комбинировать статические и динамические сегменты: 'year' 'value' => 2005, 'controller' => 'archive', 'action' => 'show' ), array('mode' => '(month|year)' 'value' => '\d+') ); $router->addRoute('archive', $route); // Сборка URL в локали, используемой по умолчанию: archive/month/5 $route->assemble(array('mode' => 'month', 'value' => '5')); // Сборка URL в немецкой локали: archiv/monat/5 $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de')); ]]>