仅重定向管理模块



我的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.
}

最新更新