我将一个简单的ACL模块设置为控制器插件。现在我想实现一个“403渲染策略”,这样对于“拒绝”我只需设置一个403响应,并且将呈现template_map中的“error / 403”视图。功能应该像原始的404策略。
我看过Zend\Mvc\View\Http\RouteNotFoundStrategy
,但发现它有点超重。有更简单的方法吗?
答案 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);