仅重定向管理模块

redirect for only admin module

我的 Admin Module.php

中有以下代码
public function onBootstrap(MvcEvent $e)
{
    $application = $e->getApplication();
    $em = $application->getEventManager();
    if(!SystemUtils::isApiRequest()){
        $em->attach(\Zend\Mvc\MvcEvent::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);

returns 管理控制器 class 我可以使用的名称,但我希望它用于所有管理控制器 classes

您应该使用 MvcEvent 对象!

如果所有控制器都在一个命名空间下,例如 \Admin\Controller:

$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.
}

您可以使用共享事件管理器附加到给定名称的事件 space。在下面的示例中,我们仅为当前模块名称 space.

附加一个事件
use Zend\Mvc\MvcEvent;

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();
    });
}

您可以将此添加到您的管理模块中,并且只有此事件将仅在该模块/名称space.

中的 类 被监听