我有一个主导航配置链路和第二只用1个链接 。 主要的导航工作正常,但是当我尝试这样的模块,建立第二导航栏:
$config = $e->getApplication()->getServiceManager()->get('config');
$navigation = new \Zend\Navigation\Navigation($config['navigation_footer']);
$e->getApplication()->getServiceManager()
->setService('new_navigation', $navigation);`
我得到一个错误,当我呈现在视图:
致命错误:Zend的\导航\异常\ DomainException:Zend的\导航\页\的mvc :: getHref不能执行,因为没有Zend的\的mvc \路由器\ RouteStackInterface例如由在/ home / CAWA / WWW / SP-应用/供应商/ zendframework /zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php上线471
问题是缺少路由器(或更精确地说,一个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);
}
}
}
正如你看到它是一个递归函数,注射进入路由器的每一页。 乏味! 因此,有一个工厂为你做到这一点。 有四个简单的步骤来实现这一目标。
第一步
把导航配置您的模块配置第一。 就像你有一个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中/导航/服务目录。
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
在这个视图助手使用。