Ответ 1
Проблема заключается в отсутствии Router (или, точнее, a 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);
}
}
}
Как вы видите, это рекурсивная функция, вставляющая маршрутизатор на каждую страницу. Скучная! Поэтому для вас есть factory. Для этого есть четыре простых шага.
ШАГ ОДИН
Сначала введите конфигурацию навигации в конфигурацию вашего модуля. Подобно тому, как вы используете навигацию 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
).
STEP TWOstrong >
A factory преобразует это в структуру объектов навигации, вам нужно сначала создать класс для этого. Создайте файл SecondaryNavigationFactory.php
в каталоге MyModule/Navigation/Service.
namespace MyModule\Navigation\Service;
use Zend\Navigation\Service\DefaultNavigationFactory;
class SecondaryNavigationFactory extends DefaultNavigationFactory
{
protected function getName()
{
return 'secondary';
}
}
См. здесь, здесь указано имя secondary
, которое совпадает с вашим навигационным ключом.
ШАГ ТРЕХ
Вы должны зарегистрировать этот factory менеджеру службы. Затем factory может работать и превращать конфигурационный файл в объект Zend\Navigation
. Вы можете сделать это в файле module.config.php:
'service_manager' => array(
'factories' => array(
'secondary_navigation' => 'MyModule\Navigation\Service\SecondaryNavigationFactory'
),
)
См., что я сделал службу secondary_navigation
здесь, где factory вернет экземпляр Zend\Navigation
. Если вы сейчас сделаете $sm->get('secondary_navigation')
, вы увидите, что это объект Zend\Navigation\Navigation
.
ШАГ ЧЕТВЕРТЫЙ
Сообщите помощнику вида использовать эту навигацию, а не по умолчанию. Помощник вида навигации принимает параметр "Навигация", где вы можете указать, какую навигацию вы хотите. В этом случае диспетчер службы имеет службу secondary_navigation
, и это тот, который нам нужен.
<?= $this->navigation('secondary_navigation')->menu() ?>
Теперь вы будете использовать навигацию secondary
, используемую в этом помощнике вида.