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

Zend framework2 在Zend Framework 2中实现403渲染策略是否有一个简单的解决方案?,zend-framework2,zend-view,Zend Framework2,Zend View,我设置了一个简单的ACL模块作为控制器插件。现在我想实现一个“403渲染策略”,这样对于“deny”,我只需要设置一个403响应,模板映射中的“error/403”视图就会被渲染。该功能应该像原来的404策略 我查看了Zend\Mvc\View\Http\RouteNotFoundStrategy,但发现它有点超重。有更简单的方法吗?你可以看看,我是这本书的作者。它允许您抛出用异常接口标记的异常。此接口确定将设置40x还是50x状态代码,以及将呈现哪个错误模板 您可以创建自己的异常 namesp

我设置了一个简单的ACL模块作为控制器插件。现在我想实现一个“403渲染策略”,这样对于“deny”,我只需要设置一个403响应,模板映射中的“error/403”视图就会被渲染。该功能应该像原来的404策略

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

你可以看看,我是这本书的作者。它允许您抛出用异常接口标记的异常。此接口确定将设置40x还是50x状态代码,以及将呈现哪个错误模板

您可以创建自己的异常

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}
然后在代码中的某个地方抛出异常,模块检查抛出的异常是否实现了任何已知接口。然后将设置一个状态代码(在本例中为403),并呈现视图
error/unauthorized

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

你可以看看,我是这本书的作者。它允许您抛出用异常接口标记的异常。此接口确定将设置40x还是50x状态代码,以及将呈现哪个错误模板

您可以创建自己的异常

namespace MyModule\Exception;

use SlmErrorException\Exception\UnauthorizedInterface;

exception UnauthorizedUserException
    extends \Exception
    implements UnauthorizedInterface
{
}
然后在代码中的某个地方抛出异常,模块检查抛出的异常是否实现了任何已知接口。然后将设置一个状态代码(在本例中为403),并呈现视图
error/unauthorized


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

这里有一个不使用第三方模块的解决方案

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

然后您可以从代码中的任意位置触发此事件:

$e = new \Zend\Mvc\MvcEvent();
$eventManager = new \Zend\EventManager\EventManager('custom');
$eventManager->trigger('403', $e);

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

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

然后您可以从代码中的任意位置触发此事件:

$e = new \Zend\Mvc\MvcEvent();
$eventManager = new \Zend\EventManager\EventManager('custom');
$eventManager->trigger('403', $e);

在问这个问题之前,你有没有调查过BjyAuthorize()?它非常完整,为你提供了一个像样的未经授权的策略…@Ocramius是的,我有。这很好,我认为它会解决问题。但可能还有另一个(较小的)解决方案吗?像在ZF1中一样,您可以在请求中更改控制器和操作,然后会引发403。在ZF2中,应用程序异常可以通过连接到
Zend\Mvc\MvcEvent::EVENT\u*\ u ERROR
事件管理器的
Zend\Mvc\application
事件之一的侦听器来处理。一个简单的闭包也能起作用:
$app->getEventManager()->attach('dispatch.error',function(){die('application error!'););
您是否查看过BjyAuthorize()在问这个问题之前?它非常完整,为你提供了一个像样的未经授权的策略…@Ocramius是的,我做了。它非常好,我认为它会解决问题。但可能还有另一个(较小的)解决方案?就像在ZF1中一样-在那里,您只需更改请求中的控制器和操作,就会引发403。在ZF2中,可以通过连接到
Zend\Mvc\MvcEvent::EVENT\u*\ u ERROR
事件管理器的
Zend\Mvc\application
事件之一的侦听器来处理应用程序异常。简单的关闭也会起作用:
$app->getEventManager()->attach('dispatch.error',function(){die('application error!'););