ZF: совместная работа Router и Navigation

Столкнулся с небольшой проблемой при одновременном использовании в проекте на ZF класса Zend_Navigation и переопределенных или дополненных роутов.

Простой пример с использованием своих роутеров:

<route>page/:show</route>

При подключении Navigation и рендеринге страниц контейнера класс будет опираться на адрес, который подошел под правило роутера и перевел запрос на описанный в параметрах обработчик. Получается, что роутер влияет на конечные ссылки и свойства страниц игнорируются. На практике получается так. Мы переходим по ссылке /module/controller/action, ссылки меню рендерятся правильно по своим свойствам. Стоит перейти по ссылке /page/page1, которую наш переопределенный роутер поймает и назначит обработчика, меню на странице опирается на данные роутинга и вместо ожидаемых /module/controller/action в одном из пунктов появляется /page/.

Первый способ

Выход нашелся достаточно простой — поскольку Navigation зависит от роутера (строки запроса), нужно обнулить сам запрос непосредственно после отработки роутера, то есть на routeShutdown:

class MyApp_Plugin_Navigation extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown()
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();
        $fixingRoute = new Zend_Controller_Request_Http();
        $fixingRoute->setRequestUri('/');
        $router->route($fixingRoute);
    }
}

Плагин регистрируется в frontController-е и навигация формирует правильные ссылки независимо от глубины вложенности.

Второй способ

Спустя время я понял, что кардинально ошибся в настройке класса навигации в проекте. Случилось это из-за тотальной кривизны документации по Zend Framework и ее неактуальности. Очень часто в коде библиотеки встречаются методы, не описанные в документации.

Так вот для правильной работы навигации с приписанными роутерами нужно все лишь задать используемый для страницы маршрут по умолчанию, правда сделать это придется для всех страниц контейнера. В моем случае с конфигами на xml нужно дописать к свойствам страницы:

<main>
            <label>Главная</label>
            <module>default</module>
            <controller>index</controller>
            <action>index</action>
			<resource>default:index</resource>
            <privilege>index</privilege>
            <route>default</route>
</main>
Rambler's Top100