gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:18:20 24 4
gpt4 key购买 nike

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

$config = $e->getApplication()->getServiceManager()->get('config');
$navigation = new \Zend\Navigation\Navigation($config['navigation_footer']);
$e->getApplication()->getServiceManager()
->setService('new_navigation', $navigation);`

在 View 中渲染它时出现错误:

Fatal error: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref cannot execute as no Zend\Mvc\Router\RouteStackInterface instance is composed in /home/cawa/www/sp-app/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php on line 471

最佳答案

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

$url = $routeStack->assemble('my/route');

这发生在 Zend\Navigation 的 MVC 页面中也。该页面有 route参数,当有可用的路由器时,页面将组装它自己的 url(或 Zend\Navigation 术语,一个 href )。如果您不提供路由器,则它无法组装路由并因此引发异常。

您必须在导航的每个页面中注入(inject)路由器:
$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);
}
}
}

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

第一步

首先将导航配置放入您的模块配置中。就像你有一个 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目的。

第四步

告诉 View 助手使用这个导航而不是默认导航。导航 View 助手接受一个“导航”参数,您可以在其中声明您想要的导航。在这种情况下,服务管理器有一个服务 secondary_navigation这就是我们需要的。
<?= $this->navigation('secondary_navigation')->menu() ?>

现在您将拥有导航 secondary在这个 View 助手中使用。

关于navigation - 如何在 zf2 中设置 2 个导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12972316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com