2012-10-08 121 views
4

在我的控制,我创建了导航对象,并把它传递给视图Zend框架2:导航

$navigation = new \Zend\Navigation\Navigation(array(
    array(
      'label' => 'Album', 
      'controller' => 'album', 
      'action' => 'index', 
      'route' => 'album', 
     ), 
    )); 

有尝试使用它

<?php echo $this->navigation($this->navigation)->menu() ?> 

并且得到错误:

Fatal error: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref cannot execute as no Zend\Mvc\Router\RouteStackInterface instance is composed in Zend\View\Helper\Navigation\AbstractHelper.php on line 471

但是我在布局中使用的导航,所以它写在这里:http://adam.lundrigan.ca/2012/07/quick-and-dirty-zf2-zend-navigation/作品。我的错误是什么?

谢谢。

回答

1

btw。如果您定义了route,则不需要定义controlleraction,仅当您的路由是通用路由且控制器/操作是可变段时。

+0

你是对的,感谢您的意见。但如果这样修复公告页面错误仍然存​​在。 '$导航=新\ Zend的\导航\导航(阵列( \t \t \t阵列( \t \t \t \t '标签'> '相册', \t:当代码运行,当它看起来那么唯一的选择\t \t \t 'URI'=> '/' \t \t \t) \t \t));'当URL被直接设置。 – Eremite

+0

hm不知道,但你有这在你的module.php? '$ application = $ e-> getApplication(); $ eventManager = $ application-> getEventManager(); $ moduleRouteListener = new ModuleRouteListener(); $ moduleRouteListener-> attach($ eventManager);' –

+0

是的在onBootstrap的方法中的Module.php中我有完全相同的代码。有趣的是我的视图中的url视图助手能够正常工作。代码'$ this-> url('album/default',array('controller'=>'album','action'=>'edit','id'=> $ id))''很好,显示一个链接在页面上。目前尚不清楚是否干扰了菜单的正确显示。如果有任何想法,我会很高兴听到他们。谢谢。 – Eremite

9

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

+0

这是一个很好的例子。它的工作原理,直到我想使用部分视图渲染。我使用这个来做我的主要导航,但这不重要。以下是我正在使用的: echo $ this-> navigation('navigation') - > menu() - > setPartial(array('navigation.phtml','Application'));错误:Zend \ ServiceManager \ Exception \ ServiceNotFoundException:Zend \ ServiceManager \ ServiceManager :: get无法在/ myapp/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation中为菜单获取或创建实例/AbstractHelper.php 471行 –

0

的问题确实是一个路由不能没有路由器来解决。我希望导航类能够解决这个问题,但显然你必须自己做。我只写了一个视图助手来介绍具有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' 
    ) 
), 

这不是一个很好的解决方案,但它的工作原理。