问题是缺少一个路由器(或更准确地说,一个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);
}
}
}
:
必须注入在导航的每一页路由器。乏味!因此有一家工厂为你做这件事。有四个简单的步骤来做到这一点。
STEP ONE
把导航配置您的模块配置第一。正如您有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
。
披露:这个答案是一样的,因为我介绍了这个问题:https://stackoverflow.com/a/12973806/434223
你是对的,感谢您的意见。但如果这样修复公告页面错误仍然存在。 '$导航=新\ Zend的\导航\导航(阵列( \t \t \t阵列( \t \t \t \t '标签'> '相册', \t:当代码运行,当它看起来那么唯一的选择\t \t \t 'URI'=> '/' \t \t \t) \t \t));'当URL被直接设置。 – Eremite
hm不知道,但你有这在你的module.php? '$ application = $ e-> getApplication(); $ eventManager = $ application-> getEventManager(); $ moduleRouteListener = new ModuleRouteListener(); $ moduleRouteListener-> attach($ eventManager);' –
是的在onBootstrap的方法中的Module.php中我有完全相同的代码。有趣的是我的视图中的url视图助手能够正常工作。代码'$ this-> url('album/default',array('controller'=>'album','action'=>'edit','id'=> $ id))''很好,显示一个链接在页面上。目前尚不清楚是否干扰了菜单的正确显示。如果有任何想法,我会很高兴听到他们。谢谢。 – Eremite