Zend_Controller_Router_Route_Chain
Zend_Controller_Router_Route_Chain
является маршрутом, который позволяет объединять несколько маршрутов
между собой. Это позволяет, например, объединять маршруты по имени
хоста с маршрутами по пути или несколько маршрутов по пути.
Объединение может быть произведено программным путем или в
конфигурационном файле.
Приоритет параметров
При объединении маршрутов параметры внешнего маршрута имеют
больший приоритет, чем параметры внутреннего маршрута.
Таким образом, если вы определили контроллер одновременно во
внутреннем и внешнем маршрутах, то будет выбран контроллер из
внешнего маршрута.
При объединении маршрутов программным путем есть два способа достижения
этого. Первый состоит в создании нового экземпляра класса
Zend_Controller_Router_Route_Chain
и последующем вызове метода chain несколько раз
со всеми маршрутами, которые должны быть объединены между собой.
Другой состоит в том, чтобы брать первый маршрут, например, маршрут по
имени хоста, и вызывать его метод chain с маршрутом,
который должен быть добавлен к нему.
При этом маршрут по имени хоста не изменяется, но будет
возвращен новый экземпляр класса
Zend_Controller_Router_Route_Chain, который
объединяет в себе два маршрута:
chain($hostnameRoute)
->chain($pathRoute);
// Второй способ - непосредственное объединение
$chainedRoute = $hostnameRoute->chain($pathRoute);
]]>
При объединении маршрутов их разделителем по умолчанию будет
косая черта. Но может понадобиться использовать и другие разделители:
chain($secondRoute, '-');
// Результирующий маршрут: "foo-bar"
echo $chainedRoute->assemble();
]]>
Объединение маршрутов через Zend_Config
Для объединения маршрутов в конфигурационном файле есть
дополнительные параметры. Наиболее простой способ состоит в
использовании параметра chains.
Это просто список маршрутов, которые будут
объединены с родительским. Ни родительский, ни дочерний
маршруты не будут добавлены в маршрутизатор напрямую, в него будет
добавлен только составленный из них маршрут. Имя объединенного
маршрута в маршрутизаторе будет состоять из имени родительского
маршрута и имени дочернего маршрута, объединенных с использованием
тире (-). Простая конфигурация в формате XML может выглядеть
следующим образом:
www.example.com
:language
imprint
users.example.com
:username
misc
]]>
Результатом будет три маршрута: www-language-index,
www-language-imprint и users-language-profile,
которые будут соответствовать только именам хоста, подходящим под
заданные определения, и маршрут misc, который будет
соответствовать любым именам хоста.
Альтернативный способ создания объединенных маршрутов состоит в
применении параметра chain,
который может использоваться только с маршрутами типа
Zend_Controller_Router_Route_Chain,
эти маршруты указываются на том же уровне, что и остальные:
www.example.com
:language
imprint
www, language, index
www, language, imprint
]]>
Вы можете также передавать параметр chain в виде
массива вместо перечисления маршрутов через запятую:
www
language
index
www
language
imprint
]]>