Php ZF2不同控制器中的不同菜单

Php ZF2不同控制器中的不同菜单,php,zend-framework,menu,navigation,zend-framework2,Php,Zend Framework,Menu,Navigation,Zend Framework2,我有一个关于ZF2中菜单的问题 例如,我有一个模块和两个控制器。在布局中,我可以渲染菜单: <?php echo $this->navigation()->menu('mainMenu'); ?> <?php echo $this->navigation()->menu('settingsMenu'); ?> 如何根据控制器将变量“menu”注册为菜单。 我试着用“onBootstrap”的方法来做,但失败了 我是这样做的: Module.ph

我有一个关于ZF2中菜单的问题

例如,我有一个模块和两个控制器。在布局中,我可以渲染菜单:

<?php echo $this->navigation()->menu('mainMenu'); ?>
<?php echo $this->navigation()->menu('settingsMenu'); ?>
如何根据控制器将变量“menu”注册为菜单。 我试着用“onBootstrap”的方法来做,但失败了


我是这样做的:

Module.php:

public function onBootstrap(MvcEvent $e)
{
    $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_DISPATCH, array($this, 'headMenuAttach'));
}

public function headMenuAttach(MvcEvent $e)
{
    $controller = $e->getTarget();

    if (method_exists($controller, 'getHeadMenu')) {
        $menu = $controller->getHeadMenu();
        $controller->layout()->setVariable('MainMenu', $menu);
    }
}
布局:

$this->navigation()->menu($this->MainMenu);
控制器:

public function getHeadMenu()
{
    return 'settingsMenu';
}

在ZF2方面是否正确?:)

正如Jurian所解释的,您必须通过扩展DefaultNavigationFactory来创建第二个导航对象。

您可以使用共享事件管理器针对特定名称空间的事件,从而分别针对您的模块

/**
 * On bootstrap event
 * 
 * @param \Zend\Mvc\MvcEvent $e
 */
public function onBootstrap(MvcEvent $e)
{
    // .. other stuff here //

    /**
     * Only in our application namespace
     * Put this part inside Application Modules Module.php
     */
    $e->getApplication()->getEventManager()->getSharedManager()
        ->attach('Application', 'dispatch', function($e) {
        $controller = $e->getTarget();
        $controllerClass = get_class($controller);
        $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

        // Attach Nav 1 here
        if (method_exists($controller, 'getHeadMenu')) {
            $menu = $controller->getHeadMenu();
            $controller->layout()->setVariable('MainMenu', $menu);
        }

    }, 100);

    /**
     * Only in our MyModule namespace
     * Put this part inside MyModule Modules Module.php
     */
    $e->getApplication()->getEventManager()->getSharedManager()
        ->attach('MyModule', 'dispatch', function($e) {

        // Attach Nav 2 here

    }, 100);
}
您可能希望将每个条目放在它自己的Modules.php引导方法中,但您已经明白了


您只针对模块命名空间中的调度事件,而不是附加到系统范围内的所有调度事件。

我已经在ServiceManager中注册了两个对象:“mainMenu”和“settingsMenu”。但我不明白如何在视图中注册“菜单”,以包含所需的菜单,具体取决于控制器。
/**
 * On bootstrap event
 * 
 * @param \Zend\Mvc\MvcEvent $e
 */
public function onBootstrap(MvcEvent $e)
{
    // .. other stuff here //

    /**
     * Only in our application namespace
     * Put this part inside Application Modules Module.php
     */
    $e->getApplication()->getEventManager()->getSharedManager()
        ->attach('Application', 'dispatch', function($e) {
        $controller = $e->getTarget();
        $controllerClass = get_class($controller);
        $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

        // Attach Nav 1 here
        if (method_exists($controller, 'getHeadMenu')) {
            $menu = $controller->getHeadMenu();
            $controller->layout()->setVariable('MainMenu', $menu);
        }

    }, 100);

    /**
     * Only in our MyModule namespace
     * Put this part inside MyModule Modules Module.php
     */
    $e->getApplication()->getEventManager()->getSharedManager()
        ->attach('MyModule', 'dispatch', function($e) {

        // Attach Nav 2 here

    }, 100);
}