2017-08-08 32 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「禁止」頁面(頁面可能有你的消息)

相關問題