在我的控制器中,我创建了导航对象并将它传递给视图
$navigation = new \Zend\Navigation\Navigation(array(
array(
'label' => 'Album',
'controller' => 'album',
'action' => 'index',
'route' => 'album',
),
));在那里试图利用它
<?php echo $this->navigation($this->navigation)->menu() ?>并得到错误:
致命错误:Zend\导航\Exception\DomainException:Zend\导航\Page\Mvc::getHref无法执行,因为第471行的Zend\View\Helper\Navigation\AbstractHelper.php中没有Zend\Mvc\Router\RouteStackInterface实例
但是我在布局中使用的导航,所以它写在这里:http://adam.lundrigan.ca/2012/07/quick-and-dirty-zf2-zend-navigation/工作。我犯了什么错?
谢谢。
发布于 2012-10-19 12:01:24
问题是缺少一个路由器(或者更准确地说,是一个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/导航/服务目录中创建一个文件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
发布于 2012-10-08 18:40:35
顺便说一下。如果定义了controller和action,则不需要定义route,只有当路由是通用的并且控制器/操作是可变段时,才需要定义route。
发布于 2014-07-29 15:44:03
问题是,没有路由器,路由是无法解决的。我希望导航类能够解决这个问题,但显然您必须自己解决。我刚刚写了一个视图助手来介绍带有MVC页面的路由器。
下面是我如何在视图中使用它:
$navigation = $this->navigation();
$navigation->addPage(
array(
'route' => 'language',
'label' => 'language.list.nav'
)
);
$this->registerNavigationRouter($navigation);
echo $navigation->menu()->render();视图助手:
<?php
namespace JarJar\View\Helper;
use Zend\View\Helper\AbstractHelper;
use Zend\View\Helper\Navigation;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Navigation\Page\Mvc;
class RegisterNavigationRouter extends AbstractHelper implements ServiceLocatorAwareInterface
{
protected $serviceLocator;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
public function getServiceLocator()
{
return $this->serviceLocator;
}
public function __invoke(Navigation $navigation)
{
$router = $this->getRouter();
foreach ($navigation->getPages() as $page) {
if ($page instanceof Mvc) {
$page->setRouter($router);
}
}
}
protected function getRouter()
{
$router = $this->getServiceLocator()->getServiceLocator()->get('router');
return $router;
}
}不要忘记将视图助手作为可调用实例添加到您的配置中:
'view_helpers' => array(
'invokables' => array(
'registerNavigationRouter' => 'JarJar\View\Helper\RegisterNavigationRouter'
)
),这不是一个很好的解决方案,但有效。
https://stackoverflow.com/questions/12781623
复制相似问题