在Zend Framework 2中获取用于导航的活动模块

时间:2012-10-14 18:27:45

标签: php zend-framework2 zend-navigation

我正在使用Skeleton Zend Framework 2来构建我的应用程序。

我想修改layout.phtml中的当前导航栏以显示2个标准链接,然后根据用户权限显示更多链接。

我如何将正在使用的活动模块(/用户为ZfcUser)显示为li class =“active”,以及如何根据加载的模块实现导航项?

3 个答案:

答案 0 :(得分:2)

在控制器中,您可以获得这样的活动模块:

$modules = $this->getEvent()->getApplication()->getServiceManager()->get('modulemanager')->getLoadedModules();
$moduleNames = array_keys($modules);

然后你可以检查模块名称加载的模块:

$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false

答案 1 :(得分:0)

这就是问题......你对“活动模块”的定义是什么?在ZF2中,顶级命名空间松散地定义了一个模块,但即便这样也不是绝对的,因为模块可以根据需要在多个命名空间下提供代码。

我写了一篇关于配置模块特定布局的博客文章,其中我更详细地解释了这个问题,并演示了基于活动模块执行操作的一种可能“解决方案”:http://blog.evan.pro/module-specific-layouts-in-zend-framework-2

在该示例中,我使用事件标识符(即模块名称(命名空间))附加到“dispatch”事件,该事件标识符仅针对正在调度的控制器的顶级命名空间触发(我特意添加了此ZF2的功能,因为它成为测试期间的常见问题)。如果您对此如何或为何如此有用感到好奇,请参阅https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(特别是撰写本文时的第158行)。

或者,您可以附加到dispatch事件,并获取调度控制器的顶级命名空间。同样,不能保证这实际上是您正在寻找的“模块名称”,并且最好只考虑调度请求时的控制器和操作,而不是“这是哪个模块?”

class Module
{
    public function onBootstrap($e) {
        $events = $e->getApplication()->getEventManager()->getSharedManager();
        $events->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
            $controllerClass = get_class($e->getTarget()); // $e->getTarget() is the controller
            $controllerTopNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'))

            // Do whatever here, maybe something like:
            // $nav = $e->getTarget()->getServiceLocator()->get('navigation');
            // $nav->...
        });
    }
}

答案 2 :(得分:0)

在控制器中,您可以这样检查活动模块

svn status