是否有一个简单的解决方案在Zend Framework 2中实现403渲染策略?

时间:2013-02-09 00:14:49

标签: zend-framework2 zend-view

我将一个简单的ACL模块设置为控制器插件。现在我想实现一个“403渲染策略”,这样对于“拒绝”我只需设置一个403响应,并且将呈现template_map中的“error / 403”视图。功能应该像原始的404策略。

我看过Zend\Mvc\View\Http\RouteNotFoundStrategy,但发现它有点超重。有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以查看SlmErrorException,我是其中的作者。它允许您抛出标有异常接口的异常。此接口确定是否将设置40x或50x状态代码以及将呈现哪个错误模板。

您可以创建自己的例外

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}

然后在代码中的某处抛出异常,模块检查抛出的异常是否实现了任何已知接口。然后将设置状态代码(在这种情况下为403),并且将呈现视图error/unauthorized

此模块正在开发中,尚未准备好投入生产。但是你可以看看它是否合适。也许你可以帮助提供稳定性并帮助编写测试,以便更多人可以使用它。

答案 1 :(得分:1)

这是一个不使用第三方模块的解决方案。

您可以创建一个自定义事件,触发时将模板设置为所需的模板(请使用代码注释):

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