我的Admin Module.php
中有以下代码
public function onBootstrap(MvcEvent $e)
{
$application = $e->getApplication();
$em = $application->getEventManager();
if(!SystemUtils::isApiRequest()){
$em->attach(ZendMvcMvcEvent::EVENT_DISPATCH, array($this,'initUser'),10000);
}
}
public function initUser(MvcEvent $e)
{
$isLoggedIn=false;
// determined elsewhere
$action = Pluto::registry('application_action');
if($action!=='login' && !$isLoggedIn){
$viewHelperManager = $e->getApplication()->getServiceManager()->get('ViewHelperManager');
$renderer = $viewHelperManager->getRenderer();
$url = $renderer->plutourl('login');
$response = $e->getApplication()->getServiceManager()->get('Response');
$response->getHeaders()->clearHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302)->sendHeaders();
exit();
}
}
问题是这只应该在管理模块内的页面内激活并且您没有登录,但它对每个请求进行操作,无论代码在哪个模块中
我想将此检查限制为仅在访问管理模块时。
更新
$sm = $e->getApplication()->getServiceManager();
$router = $sm->get('router');
$request = $sm->get('request');
$matchedRoute = $router->match($request);
返回我可以使用的管理员控制器类名称,但我希望它适用于所有管理控制器类
可以使用共享事件管理器附加到给定名称空间中的事件。在下面的示例中,我们仅附加到当前模块命名空间的事件。
use ZendMvcMvcEvent;
public function onBootstrap(MvcEvent $e)
{
$app = $e->getApplication();
$em = $app->getEventManager()->getSharedManager();
$sm = $app->getServiceManager();
$em->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, function ($e) use ($sm) {
/**
* this will be triggered only by controlers in
* this module/namespace...
*/
$this->doSomething();
});
}
您可以在管理模块中添加此事件,并且仅侦听此模块/命名空间中的类的此事件。
你应该使用 MvcEvent
对象!
如果所有控制器都在单个命名空间下,例如AdminController
:
$namespace = 'Admin\Controller\';
$matchController = $e->getRouteMatch()->getParam('controller');
if( $namespace === substr($matchController, 0, strlen($namespace))
{
// check here if user is logged in.
}
else {
// not an admin controller, do nothing.
}