Zend framework2 通过ServiceManager使用视图帮助器注入自定义导航

Zend framework2 通过ServiceManager使用视图帮助器注入自定义导航,zend-framework2,Zend Framework2,我刚刚开始为Zend Framework 2开发。我正在尝试向我的应用程序添加一个简单的菜单。菜单最终将作为用户可定义的书签从数据库加载,因此目前,我正在尝试实例化我定义的视图帮助器,以编程方式在控制器中添加页面,然后将视图帮助器的导航插入视图模型。我的问题是,当我尝试使用ServiceLocator在控制器中检索视图帮助程序时,会得到一个ServiceNotFoundException: Application\View\Helper\ShortcutsMenu: namespace

我刚刚开始为Zend Framework 2开发。我正在尝试向我的应用程序添加一个简单的菜单。菜单最终将作为用户可定义的书签从数据库加载,因此目前,我正在尝试实例化我定义的视图帮助器,以编程方式在控制器中添加页面,然后将视图帮助器的导航插入视图模型。我的问题是,当我尝试使用ServiceLocator在控制器中检索视图帮助程序时,会得到一个
ServiceNotFoundException

Application\View\Helper\ShortcutsMenu:

    namespace Application\View\Helper;

    use Zend\Navigation\Navigation;

    class ShortcutsMenu extends Navigation {

        public function shortcutsMenu() {
            //...
        }

        public function __construct() {
            //...
        }

    }
在Module.php中

public function getServiceConfig() {
    return array(
        'view_helper' => array(
            'factories' => array(
                'shortcutsmenu' => function($sm) {
                    $smenu = new \Application\View\Helper\ShortcutsMenu();
                    return $smenu;
                }
            ),
        ),
    );
IndexController.php:

    $smenu = $this->getServiceLocator()->get('shortcutsmenu'); // throws ServiceNotFoundException
    //"Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for shortcutsmenu"

    $smenu->addPage(AbstractPage::factory(array(
        'label' => 'Homepage',
        'order' => '-1',
        'uri' => '/',
    )));

    // ...
}
谁能告诉我我错过了什么

编辑: 我希望在应用程序范围的布局中生成的HTML类似于:

<!-- Side tabs shortcuts -->
<ul id="shortcuts">
    <li class="current"><a href="./" class="shortcut-home" title="Home">Home</a></li>
    <li><a href="userpage1.html" title="My messages">My messages</a></li>
    <li><a href="/a/b/c?id=4" title="Bob's calendar">Bob's calendar</a></li>
    <li>...</li>
</ul>


可能使用URI样式的链接而不是MVC链接。

无需扩展导航容器
Zend\navigation\navigation
,也无需扩展内置视图帮助程序来呈现菜单

A管理导航结构中的所有页面。以下是创建容器的几种方法

所有(菜单、面包屑)都将容器用作导航数据的提供者。可以使用
setContainer()
在视图辅助对象上设置新容器。或者,您可以只调用视图中的视图辅助对象,而不进行容器设置,视图辅助对象将为您创建一个新的空容器

如果由于默认视图帮助程序不提供某些替代渲染,因此需要进行某些替换渲染,则可以创建自己的导航视图帮助程序

namespace MyNamespace\View\Helper\Navigation;

use Zend\View\Helper\Navigation\AbstractHelper;

class MyHelper extends AbstractHelper
{
}
接下来,将视图帮助器注册到导航插件管理器。我认为你可以这样做(未经测试):

现在在视图中调用自定义帮助器:

$this->navigation()->myHelper()

为什么要扩展
Zend\Navigation\Navigation
?如果您只需要添加页面,则无需扩展。我们使用的HTML模板有两个导航系统-一个传统的嵌套列表模板,以及一个由6-7个图标组成的侧栏,其中一个位于屏幕的两侧,其作用类似于快捷方式。我的理由是,我将为传统菜单使用内置菜单视图帮助器,并为快捷方式创建新的导航帮助器。我已更新了我的答案,您可以如何定义自己的帮助器来渲染菜单等。好的,我理解要渲染菜单,我应该从视图调用视图帮助器,类似于:
但是添加到容器中的页面在哪里?它们是从路线自动填充的吗?是的,您可以在视图中添加页面<代码>$this->navigation()->addPages()。好吧,我想我在控制器中做的太多了。但是这个菜单需要一个从数据库中提取的页面集合。我不认为这个功能会出现在视图中,是吗?我会这样做。创建一个独立的服务类,它依赖于您的db驱动程序,并让它返回一个完全设置的导航容器。现在在视图助手上设置此容器
$this->navigation()->menu()->setContainer($myContainer)
。现在你有了清晰的关注点分离,你的控制器非常轻。
$this->navigation()->myHelper()