从Module.php的名称重定向到Literal路由

时间:2014-09-26 14:07:12

标签: php zend-framework2

我在Acl中正在Module.php进行操作,并且我希望将用户重定向到特定路线(如果他们未经授权)。 我的路线是Literal并且是无参数的(即,在配置中设置了默认控制器和动作参数)。

我无法找到办法。

实际上我知道我可以设置我的RouteMatch的控制器和动作参数(我从MvcEvent得到它)但是我希望按名称设置新路线而不设置参数。

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

这取决于您要从中重定向的函数定义。

  1. 一个可以是一个简单而直接的onBootstrap - > on Dispatch,函数定义 -
  2. 例如:

    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);
        }
        ......
        ........
    }
    
    1. 其他可能是onBootstrap - > on Route -
    2. 这很棘手,因为函数甚至在路由完成之前就被执行了,所以你还没有$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();
      }
      

      只是为了获取当前的route_name,controller_name和action_name。

      可以使用这个 -

      $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'];
      

      我希望它有所帮助。