2017-08-08 30 views
0

我的Zend Framework 3应用程序管理订单:如何在模块内重定向,并在ZF3中限制访问而不退出()?

  • 每个用户都可以下订单。
  • 每个用户都可以看到任何订单。
  • 如果他是该订单的创建者,每个用户都可以编辑他的订单。否则,他会得到状态码403并被重定向到相应的页面。

实现在MyModule\Module#onRoute(...)如下:

public function onRoute(EventInterface $event) 
{ 
    if ($event->getRequest() instanceof HttpRequest) { 
     ... 
     if (! $acl->isAllowed($role, $controller, $action)) { 
      /** @var Response $response */ 
      $response = $event->getResponse(); 
      $config = $serviceManager->get('config'); 
      $redirectRoute = ! empty($config['acl']['redirect_route']) ? $config['acl']['redirect_route'] : null; 
      if (! empty($redirectRoute)) { 
       $url = $event->getRouter()->assemble($redirectRoute['params'], $redirectRoute['options']); 
       $response->getHeaders()->addHeaderLine('Location', $url); 
       $response->setStatusCode(Response::STATUS_CODE_403); 
       $response->sendHeaders(); 
       exit(); // <-- this makes the code untestable 
      } else { 
       ... 
      } 
     } 
    } elseif ($event->getRequest() instanceof ConsoleRequest) { 
     ... 
    } 
} 

它的工作。但现在,我正在编写集成测试,并且这个调用会打破它们。

什么是在这个地方的替代exit()和重定向的Module类中的一个适当的/干净的方式?

回答

0

它的工作原理与状态码302(而不是403):

$response->setStatusCode(Response::STATUS_CODE_302); 
0

在HTTP Resopnse代码 “403” 不是redirectional代码,它只是一个客户端错误。

以下代码那里redirection-

// REDIRECTION CODES 
     300 => 'Multiple Choices', 
     301 => 'Moved Permanently', 
     302 => 'Found', 
     303 => 'See Other', 
     304 => 'Not Modified', 
     305 => 'Use Proxy', 
     306 => 'Switch Proxy', // Deprecated 
     307 => 'Temporary Redirect', 

现在按点

-Every用户可以编辑他的命令,如果他是这个命令的创造者。否则,他会得到状态码403并被重定向到相应的页面。

你应该处理它,只是重定向到403“禁止”页面(页面可能有你的消息)

相关问题