Как настроить 2 навигации в zf2?
У меня есть конфиг для основной навигационной ссылки, а вторая просто с 1 ссылкой. Основная навигация работает нормально, но когда я пытаюсь настроить вторую панель навигации в модуле так:
$config = $e->getApplication()->getServiceManager()->get('config');
$navigation = new \Zend\Navigation\Navigation($config['navigation_footer']);
$e->getApplication()->getServiceManager()
->setService('new_navigation', $navigation);`
Я получаю сообщение об ошибке при отображении в виде:
Неустранимая ошибка: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref не может быть выполнен, поскольку экземпляр Zend\Mvc\Router\RouteStackInterface не находится в /home/cawa/www/sp-app/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php в строке 471
1 ответ
Проблема в отсутствии Маршрутизатора (или, если быть более точным, Zend\Mvc\Router\RouteStackInterface
). Стек маршрутов представляет собой набор маршрутов и может использовать имя маршрута, чтобы превратить его в URL. В основном он принимает имя маршрута и создает для вас URL:
$url = $routeStack->assemble('my/route');
Это происходит на страницах MVC Zend\Navigation
тоже. На странице есть route
параметр и когда есть доступный маршрутизатор, страница собирает свой собственный URL (или в Zend\Navigation
условия, href
). Если вы не предоставляете маршрутизатор, он не может собрать маршрут и, таким образом, выдает исключение.
Вы должны внедрить роутер на каждой странице навигации:
$navigation = new Navigation($config);
$router = $serviceLocator->get('router');
function injectRouter($navigation, $router) {
foreach ($navigation->getPages() as $page) {
if ($page instanceof MvcPage) {
$page->setRouter($router);
}
if ($page->hasPages()) {
injectRouter($page, $router);
}
}
}
Как видите, это рекурсивная функция, внедряющая маршрутизатор в каждую страницу. Скучная! Поэтому есть фабрика, чтобы сделать это для вас. Есть четыре простых шага, чтобы это произошло.
ПЕРВЫЙ ШАГ
Сначала поместите конфигурацию навигации в конфигурацию вашего модуля. Так же, как у вас есть default
навигация, вы можете создать второй secondary
,
'navigation' => array(
'secondary' => array(
'page-1' => array(
'label' => 'First page',
'route' => 'route-1'
),
'page-2' => array(
'label' => 'Second page',
'route' => 'route-2'
),
),
),
У вас есть маршруты к вашей первой странице (route-1
) и вторая страница (route-2
).
ШАГ ВТОРОЙ
Фабрика преобразует это в структуру объекта навигации, для этого нужно сначала создать класс. Создать файл SecondaryNavigationFactory.php
в вашем каталоге MyModule / Navigation / Service.
namespace MyModule\Navigation\Service;
use Zend\Navigation\Service\DefaultNavigationFactory;
class SecondaryNavigationFactory extends DefaultNavigationFactory
{
protected function getName()
{
return 'secondary';
}
}
Смотри, я поставил имя secondary
здесь, который совпадает с вашей навигационной клавишей.
ТРЕТИЙ ШАГ
Вы должны зарегистрировать эту фабрику у менеджера сервиса. Тогда фабрика может сделать свою работу и превратить файл конфигурации в Zend\Navigation
объект. Вы можете сделать это в вашем module.config.php:
'service_manager' => array(
'factories' => array(
'secondary_navigation' => 'MyModule\Navigation\Service\SecondaryNavigationFactory'
),
)
Видишь, я сделал услугу secondary_navigation
здесь, где фабрика вернет Zend\Navigation
экземпляр тогда. Если вы делаете сейчас $sm->get('secondary_navigation')
вы увидите, что это Zend\Navigation\Navigation
объект.
ШАГ ЧЕТВЕРТЫЙ
Скажите помощнику вида использовать эту навигацию, а не по умолчанию. Помощник вида навигации принимает параметр "навигация", в котором вы можете указать, какую навигацию вы хотите. В этом случае у менеджера сервиса есть сервис secondary_navigation
и это то, что нам нужно.
<?= $this->navigation('secondary_navigation')->menu() ?>
Теперь у вас будет навигация secondary
используется в этом представлении помощник.