如何创建403 Forbidden错误模板并进行渲染

时间:2015-02-08 12:09:53

标签: zend-framework2

我想创建一个403 Forbidden错误模板并从控制器渲染它。

在我的module.config.php中,我有以下条目。

    'view_manager' => array(
    'display_not_found_reason' => true,
    'display_exceptions'       => true,
    'doctype'                  => 'HTML5',
    'not_found_template'       => 'error/404',
    'forbidden_template'       => 'error/403',
    'exception_template'       => 'error/index',
    'template_map' => array(
        'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
        'error/404'               => __DIR__ . '/../view/error/404.phtml',
        'error/403'               => __DIR__ . '/../view/error/403.phtml',
        'error/index'             => __DIR__ . '/../view/error/index.phtml',
    ),
    'template_path_stack' => array(
        __DIR__ . '/../view',
    ),
),

如您所见,我已将403模板和403.phtml添加到我的视图/错误文件夹中。

在我的控制器中,我尝试过。

$response = $this->getResponse();
$response->setStatusCode(403);

但没有任何反应,默认页面会被渲染。当我在上面的代码中将403更改为404时,将呈现404错误页面。

请有人告诉我我错过了什么,非常感谢。

1 个答案:

答案 0 :(得分:0)

尝试使用onBootstrap来执行此类操作(如果它适合您的应用)。想象一下,你附上一个事件来收听EVENT_ROUTE:

public function onBootstrap(MvcEvent $event) {
    $eventManager = $event->getApplication()->getEventManager();
    $eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'protectPage'), -100);
}

现在在protectPage函数中,我们可以决定在任何时候设置对禁止的响应(403):

public function protectPage(MvcEvent $event) {
   $match = $event->getRouteMatch();
   ...
   $response = $event->getResponse()->setStatusCode(403);
   //If the 403 template doesnt show, you may try to redirect to an action which has the template. check the following lines.
   $match->setParam('controller', 'User\Controller\Account');
   $match->setParam('action', 'denied');
   ...
}