通过ServiceManager使用View Helper注入自定义导航

时间:2013-02-22 05:11:19

标签: zend-framework2

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

应用程序\视图\助手\ 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链接。

1 个答案:

答案 0 :(得分:2)

无需扩展导航容器Zend\Navigation\Navigation或将内置视图助手扩展为渲染菜单。

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

所有view helpers(菜单,面包屑)都使用容器作为导航数据的提供者。您可以使用setContainer()在视图助手上设置新容器。或者,您可以在视图中调用视图助手,而无需设置容器,视图助手将为您创建一个新的空容器。

如果您需要一些备用渲染,因为默认视图助手不提供它,您可以创建自己的导航视图助手。

namespace MyNamespace\View\Helper\Navigation;

use Zend\View\Helper\Navigation\AbstractHelper;

class MyHelper extends AbstractHelper
{
}

接下来将您的视图助手注册到导航插件管理器。我认为你可以做这样的事情(未经测试):

class Module
{
    public function onBootstrap($e)
    {
        $application = $e->getApplication();
        /** @var $serviceManager \Zend\ServiceManager\ServiceManager */
        $serviceManager = $application->getServiceManager();

        $pm = $serviceManager->get('ViewHelperManager')->get('Navigation')->getPluginManager();
        $pm->setInvokableClass('myHelper', 'MyNamespace\View\Helper\Navigation\MyHelper');
    }
}

现在在您的视图中调用自定义助手:

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