2013-02-09 2 views
1

Я установил простой модуль ACL в качестве плагина контроллера. Теперь я хотел бы реализовать «стратегию рендеринга 403», так что для «deny» я просто задал ответ 403, и представление «error/403» из шаблона будет отображаться. Функциональность должна соответствовать оригинальной стратегии 404.Есть ли простое решение для реализации стратегии рендеринга 403 в Zend Framework 2?

Я взглянул на Zend\Mvc\View\Http\RouteNotFoundStrategy, но нашел это немного избыточным весом. Есть ли более простой способ сделать это?

+0

Перед тем, как задать вопрос, вы заглянули в BjyAuthorize (https://github.com/bjyoungblood/BjyAuthorize/)? Это довольно полно и предоставляет вам достойную несанкционированную стратегию ... – Ocramius

+0

@ Окрамиус да, я сделал. Это довольно хорошо, и я думаю, что это решит проблему. Но может быть есть другое (меньшее) решение? Как и в ZF1 - там вы можете просто изменить контроллер и действие в запросе, и 403 будет поднят. – Toni

+3

В ZF2 исключения приложений могут обрабатываться через прослушиватели, подключенные к одному из событий «Zend \ Mvc \ MvcEvent :: EVENT _ * _ ERROR» в менеджере событий Zend \ Mvc \ Application. Простое закрытие тоже будет работать: '$ app-> getEventManager() -> attach ('dispatch.error', function() { die ('application error!'); );' – Ocramius

ответ

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^