1

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

我看了看,Zend\Mvc\View\Http\RouteNotFoundStrategy但发现它有点超重。有没有更简单的方法可以做到这一点?

4

2 回答 2

2

您可能会看一下我是其中的作者的SlmErrorException 。它允许您抛出标有异常接口的异常。这个接口决定是设置 40x 还是 50x 状态码,以及渲染哪个错误模板。

您可以创建自己的异常

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}

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

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

于 2013-02-09T08:46:04.307 回答
2

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

您可以创建一个自定义事件,该事件在触发时会将模板设置为所需的模板(请重新添加代码注释):

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);
于 2016-04-29T07:09:15.703 回答