2013-02-09 34 views
1

我設置了一個簡單的ACL模塊作爲控制器插件。現在我想實現一個「403渲染策略」,以便「拒絕」我只設置一個403響應,並且將渲染template_map中的「錯誤/ 403」視圖。該功能應該像原來的404策略。我看過Zend\Mvc\View\Http\RouteNotFoundStrategy,但發現它有點超重。有沒有更簡單的方法來做到這一點?在Zend Framework 2中是否有一個簡單的解決方案來實現403渲染策略?

+0

在問這個問題之前,你看過BjyAuthorize(https://github.com/bjyoungblood/BjyAuthorize/)嗎?這是相當完整的,併爲您提供一個體面的未經授權的策略... – Ocramius 2013-02-11 17:04:07

+0

@Ocramius是的,我做到了。這很不錯,我認爲它會解決問題。但可能有另一種(較小的)解決方案?就像在ZF1中那樣 - 你可以在請求中改變控制器和動作,並且403會被提升。 – Toni 2013-02-12 22:11:22

+3

在ZF2中,應用程序異常可以通過連接到Zend \ Mvc \ Application'事件管理器的'Zend \ Mvc \ MvcEvent :: EVENT _ * _ ERROR'事件之一的偵聽器來處理。簡單的關閉也可以工作: '$ app-> getEventManager() - > attach('dispatch.error',function(){ die('application error!'); );' – Ocramius 2013-02-12 22:14:22

回答

2

你可能會看看SlmErrorException,其中我是作者。它允許您拋出標有異常接口的異常。該接口決定是否設置40x或50x狀態碼以及將渲染哪個錯誤模板。

您可以創建自己的異常

namespace MyModule\Exception; 

use SlmErrorException\Exception\UnauthorizedInterface; 

exception UnauthorizedUserException 
    extends \Exception 
    implements UnauthorizedInterface 
{ 
} 

然後你的地方拋出異常的代碼,如果拋出的異常實現任何已知接口的模塊檢查。然後將設置一個狀態代碼(所以在這種情況下,403)和視圖error/unauthorized將被渲染。

此模塊正在開發中,尚未準備好生產。但你可能會看一看,看看它是否合適。也許你可以幫助提供穩定和幫助編寫測試,讓更多的人可以使用它。

0

這是一個不使用第三方模塊的解決方案。

您可以創建自定義事件觸發時,將設置模板所需的一個(請蘆葦代碼註釋):

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager = $e->getApplication()->getEventManager(); 

    $eventManager->getSharedManager()->attach('custom', '403', function(MvcEvent $event) use($eventManager){ 

     //set the 403 template you have previously prepared 
     $viewModel = new ViewModel(); 
     $viewModel->setTemplate('error/403'); 

     $appViewModel = $event->getViewModel(); 
     $appViewModel->setTemplate('layout/layout');//set the default layout (optional) 
     $appViewModel->addChild($viewModel, 'content');//add the 403 template to the app layout 

     //prevent the MvcEvent::EVENT_DISPATCH to fire by calling it 
     //with high priority (100) and using $event->stopPropagation(true); 
     $eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) { 
      $event->stopPropagation(true); 
     }, 100); 
    }); 
} 

然後你就可以從代碼的任何地方觸發該事件:

$e = new \Zend\Mvc\MvcEvent(); 
$eventManager = new \Zend\EventManager\EventManager('custom'); 
$eventManager->trigger('403', $e); 
相關問題