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

时间:2012-10-19 10:26:57

标签: navigation config zend-framework2

我有主导航link的配置,第二个只有1 link。主导航工作正常,但是当我尝试在模块中设置第二个导航栏时,这样:

$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 /中组成第471行上的vendor / zendframework / zendframework / library / Zend / View / Helper / Navigation / AbstractHelper.php

1 个答案:

答案 0 :(得分:43)

问题是缺少路由器(或者更准确地说,是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);
    }
  }
}

如您所见,它是一个递归函数,将路由器注入每个页面。乏味!因此,有一家工厂为您做这件事。 有四个简单的步骤来实现这一目标。

第一步

首先将导航配置放入模块配置中。就像您拥有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)的路线。

第二步

工厂会将其转换为导航对象结构,您需要先为其创建一个类。在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_navigation,然后工厂将返回Zend\Navigation个实例。如果您现在$sm->get('secondary_navigation'),则会看到Zend\Navigation\Navigation对象。

第四步

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

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

现在,您将在此视图助手中使用导航secondary