Navigation 如何在zf2中设置2个导航?

Navigation 如何在zf2中设置2个导航?,navigation,config,zend-framework2,Navigation,Config,Zend Framework2,我有一个主导航配置,第二个配置只有1。主导航工作正常,但当我尝试在模块中设置第二个导航栏时,如下所示: $config = $e->getApplication()->getServiceManager()->get('config'); $navigation = new \Zend\Navigation\Navigation($config['navigation_footer']); $e->getApplication()->getServiceManage

我有一个主导航配置,第二个配置只有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无法执行,因为第471行的/home/cawa/www/sp app/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php中没有Zend\Mvc\Router\RouteStackInterface实例


问题是缺少路由器(或者更准确地说,是
Zend\Mvc\Router\RouteStackInterface
)。路由堆栈是路由的集合,可以使用路由名称将其转换为url。基本上,它接受路由名称并为您创建url:

$url = $routeStack->assemble('my/route');
这也发生在
Zend\Navigation
的MVC页面中。该页面有一个
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);
    }
  }
}
正如您所看到的,它是一个递归函数,将路由器注入到每个页面中。乏味的因此,有一家工厂为您做这件事。要做到这一点,有四个简单的步骤

第一步

首先将导航配置放在模块配置中。正如您有一个
默认导航一样,您可以创建第二个
辅助导航

'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
)的路由

第二步

工厂会将其转换为导航对象结构,您需要首先为此创建一个类。在MyModule/Navigation/Service目录中创建一个文件
SecondaryNavigationFactory.php

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\u导航
,工厂将返回一个
Zend\navigation
实例。如果现在执行
$sm->get('secondary_navigation')
,您将看到这是一个
Zend\navigation\navigation
对象

第四步

告诉视图帮助器使用此导航,而不是默认导航。导航视图帮助器接受一个“导航”参数,您可以在其中声明所需的导航。在这种情况下,服务管理器有一个服务
辅助导航
,这正是我们需要的

<?= $this->navigation('secondary_navigation')->menu() ?>


现在,您将在该视图帮助器中使用导航
辅助

上显示了错误消息,但该问题没有可接受的答案,即使使用ACL,也无法完美解决此问题。您所说的“必须在导航的每个页面中插入路由器”是什么意思?我需要在哪里写代码?