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

Posted

技术标签:

【中文标题】如何在 zf2 中设置 2 个导航?【英文标题】:How to set up 2 navigations in zf2? 【发布时间】:2012-10-09 22:53:39 【问题描述】:

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

$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 无法执行,因为 /home/cawa/www/sp-app/ 中没有 Zend\Mvc\Router\RouteStackInterface 实例vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php 在第 471 行

【问题讨论】:

***.com/questions/12781623/… 上显示错误消息,但该问题没有可接受的答案- 【参考方案1】:

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

【讨论】:

即使使用 ACL 也能完美运行 你说“你必须在导航的每个页面中注入路由器”是什么意思?我需要在哪里编写代码?

以上是关于如何在 zf2 中设置 2 个导航?的主要内容,如果未能解决你的问题,请参考以下文章

如何在所有场景中设置导航栏背景颜色

如何在运行时在由 android studio 创建的导航抽屉中设置默认片段

如何在导航栏中设置活动指示器?

ZF2 - 如何正确设置标题?

如何在 Swift 中设置导航栏的标题? [复制]

如何在导航栏swift ui中设置左右按钮(前导/尾随)?