我正在尝试检查每个路由的用户登录信息,详见此ZfcUser问题:https://github.com/ZF-Commons/ZfcUser/issues/187
将事件附加到MvcEvent :: EVENT_ROUTE事件 - 简单。
但是,我只想保护我的Admin模块而不是Application模块。我确信我曾经能够使用SharedEventManger将事件附加到特定的命名空间,但这似乎不再起作用 - 在最近的ZF2版本中是否更改了SharedEventManger?
我的代码:
namespace Admin;
use Zend\ModuleManager\ModuleManager;
use Zend\Mvc\MvcEvent;
class Module
{
public function init(ModuleManager $moduleManager) {
$sharedEventManager = $moduleManager->getEventManager()->getSharedManager();
$sharedEventManager->attach(
__NAMESPACE__,
MvcEvent::EVENT_ROUTE,
array('Admin\Authentication\Enforcer', 'enforceApplication'),
-100
);
}
...
如果我将第一个属性从_ _ NAMESPACE _ _更改为'*',则会触发该事件!
如何附加'route'事件,以便仅在特定命名空间中触发? 或者一旦事件被触发,我如何获得触发器的命名空间,以便我可以添加“if Admin”子句。
非常感谢提前。
皮特
答案 0 :(得分:0)
我设法从路线中识别出管理模块:
/**
* Is this an Admin event (determined by route)
*
* @param \Zend\Mvc\MvcEvent $e
* @return boolean
*/
static public function isAdmin(MvcEvent $e) {
$match = $e->getRouteMatch();
$controller = $e->getTarget();
if (
!$match instanceof \Zend\Mvc\Router\RouteMatch ||
0 !== strpos($match->getMatchedRouteName(), 'admin') ||
(
$controller instanceof \Zend\Mvc\Controller\AbstractController &&
$controller->getEvent()->getResult()->terminate()
)
) {
return false;
}
return true;
}
有比这更好的方法吗?理想情况下使用SharedEventManger的第一个参数。
谢谢, 皮特