2017-01-12 5 views
2

У меня есть следующий код в моем 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(); 
    } 
} 

Проблема заключается в это только предполагается активировать, когда внутри страницы в модуле администратора, и вы не вошли в , но его эксплуатации для каждого запроса, независимо от модуля, код находится внутри

Я хочу ограничить эту проверку только при доступе к модулю администратора.

Update

$sm = $e->getApplication()->getServiceManager(); 
    $router = $sm->get('router'); 
    $request = $sm->get('request'); 
    $matchedRoute = $router->match($request); 

возвращает имя класса контроллера администратора, который я могу использовать, но я хочу это для всех контроллеров админ классов

ответ

1

Вы можете использовать общий менеджер событий для подключения к событиям в заданном пространстве имен. В приведенном ниже примере мы присоединяем к событию только для текущего пространства имен модулей.

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

Вы можете добавить это в свой административный модуль, и только это событие будет прослушиваться только для классов внутри этого модуля/пространства имен.

0

Вы должны использовать 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. 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^