我设置了一个简单的 ACL 模块作为控制器插件。现在我想实现一个“403 渲染策略”,这样对于“拒绝”,我只需设置一个 403 响应,然后将渲染来自 template_map 的“error/403”视图。该功能应该类似于原始的 404 策略。
我看了看,Zend\Mvc\View\Http\RouteNotFoundStrategy
但发现它有点超重。有没有更简单的方法可以做到这一点?
我设置了一个简单的 ACL 模块作为控制器插件。现在我想实现一个“403 渲染策略”,这样对于“拒绝”,我只需设置一个 403 响应,然后将渲染来自 template_map 的“error/403”视图。该功能应该类似于原始的 404 策略。
我看了看,Zend\Mvc\View\Http\RouteNotFoundStrategy
但发现它有点超重。有没有更简单的方法可以做到这一点?
您可能会看一下我是其中的作者的SlmErrorException 。它允许您抛出标有异常接口的异常。这个接口决定是设置 40x 还是 50x 状态码,以及渲染哪个错误模板。
您可以创建自己的异常
namespace MyModule\Exception;
use SlmErrorException\Exception\UnauthorizedInterface;
exception UnauthorizedUserException
extends \Exception
implements UnauthorizedInterface
{
}
然后在代码中的某处抛出异常,模块会检查抛出的异常是否实现了任何已知接口。然后将设置一个状态码(在本例中为 403)并error/unauthorized
呈现视图。
该模块正在开发中,尚未准备好投入生产。但是你可以看看它是否合适。也许您可以帮助稳定并帮助编写测试,以便更多人可以使用它。
这是一个不使用第三方模块的解决方案。
您可以创建一个自定义事件,该事件在触发时会将模板设置为所需的模板(请重新添加代码注释):
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);