我正在使用 Skeleton Zend Framework 2 来构建我的应用程序。
我想修改 layout.phtml 中的当前导航栏以显示 2 个链接作为标准,然后根据用户权限显示更多链接。
我将如何让正在使用的活动模块(ZfcUser 的 /user)显示为 li class="active",以及如何根据加载的模块实现导航项?
我正在使用 Skeleton Zend Framework 2 来构建我的应用程序。
我想修改 layout.phtml 中的当前导航栏以显示 2 个链接作为标准,然后根据用户权限显示更多链接。
我将如何让正在使用的活动模块(ZfcUser 的 /user)显示为 li class="active",以及如何根据加载的模块实现导航项?
在控制器中,您可以获得如下活动模块:
$modules = $this->getEvent()->getApplication()->getServiceManager()->get('modulemanager')->getLoadedModules();
$moduleNames = array_keys($modules);
然后你可以检查模块名称加载的模块:
$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false
问题来了……您对“活动模块”的定义是什么?在 ZF2 中,模块由顶级命名空间松散地定义,但这也不是绝对的,因为模块可以根据需要在多个命名空间下提供代码。
我写了一篇关于配置特定于模块的布局的博客文章,我在其中更详细地解释了这个问题,并展示了基于活动模块执行操作的一种可能的“解决方案”:http ://blog.evan.pro/ zend-framework-2 中的模块特定布局
在该示例中,我使用事件标识符附加到“调度”事件,该事件标识符是模块名称(命名空间),它仅在被调度的控制器的顶级命名空间中触发(我专门将此功能添加到 ZF2 ,因为它在测试阶段已成为一个常见问题)。如果您对它的工作原理或原因感到好奇,请参阅https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(特别是写作时的第 158 行这个)。
或者,您可以附加到调度事件,并获取正在调度的控制器的顶级命名空间。同样,不能保证这实际上是您正在寻找的“模块名称”,并且在调度请求时最好只考虑控制器和操作,而不是“这是哪个模块?”
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->...
});
}
}
在控制器中,您可以通过这种方式检查活动模块
$bIsModule = (bool) $this->getEvent()
->getApplication()
->getServiceManager()
->get('modulemanager')
->getModule('ZfcUser'); // returns true or false