2014-09-26 39 views
0

我在做Acl在我的Module.php,我想重定向用戶到一個特定的路線,如果他們是未經授權的。 我的路線是Literal並且是無參數的(即,在config中設置了默認控制器和動作參數)。重定向到文字路由的名稱從Module.php

我只是找不到辦法。

其實我知道我可以設置我的RouteMatch(我從MvcEvent得到它)的控制器和動作參數,但我想通過它的名稱設置一個新的路線,而不設置參數。

任何幫助表示讚賞,感謝

回答

1

這取決於你想從重定向功能定義。

  1. 一個可以是簡單的和直接的onBootstrap - >on Dispatch,函數定義 -

例如:

use Zend\Mvc\MvcEvent; 
..... 
........ 

class Module { 

    public function onBootstrap(MvcEvent $e) 
    { 
     $e->getApplication()->getEventManager()->getSharedManager()->attach('SOME_CONTROLLER OR * (-> all controllers)', 'dispatch', function($e) { 
      $controller = $e->getTarget(); 
      if (unauthorized_user) { 
       $controller->plugin('redirect')->toRoute('ROUTE_NAME'); 
      } 
     }, 100); 
    } 
    ...... 
    ........ 
} 
  • 其他可能onBootstrap - >on Route -
  • T他會變得棘手,因爲即使在路由完成之前該函數也會被執行,所以你還沒有一個$e->getTarget()即Controller對象。

    public function onBootstrap(MvcEvent $e) { 
        $e->getApplication() 
          ->getEventManager() 
          ->getSharedManager() 
          ->attach('*', 'route', function($e) { 
    
         if (unauthorized_user) { 
          return $this->customRedirect($e, 'ROUTE_NAME'); 
         } else { 
          return $this->customRedirect($e, 'ROUTE_NAME', 'ACTION_NAME'); 
         } 
        }, 100); 
    } 
    
    public function customRedirect($event, $route, $action = '') { 
        $url = $event->getRouter()->assemble(array('action' => $action), array('name' => $route)); 
    
        $response = $event->getResponse(); 
        $response->getHeaders()->addHeaderLine('Location', $url); 
        $response->setStatusCode(302); 
        $response->sendHeaders(); 
        exit(); 
    } 
    

    只是爲了獲取當前的路由名稱,控制器名稱和動作名稱。

    可以利用這一點 -

    $sm = $e->getApplication()->getServiceManager(); 
    $router = $sm->get('router'); 
    $request = $sm->get('request'); 
    $matchedRoute = $router->match($request); 
    $params = $matchedRoute->getParams(); 
    
    $route_name = $matchedRoute->getMatchedRouteName(); 
    $controller_name = $params['controller']; 
    $action_name = $params['action']; 
    

    我希望它可以幫助別人。

    +0

    與$ router-> assemble()組合發送頭文件對我來說似乎是最好的方法 - 我會試試它並將其標記爲一個答案,如果一切按預期工作 – dan 2014-09-27 13:55:35

    +0

    行它OK,謝謝!我不知道路由器的assemble()方法 – dan 2014-09-27 14:03:57