在Zend Framework 2中的不同模块中使用相同的错误处理程序

时间:2014-02-07 08:33:50

标签: php zend-framework2 http-status-code-404 zend-framework-modules

我在Zend应用程序中有很多模块。每个模块都会有错误和例外,对吧?所以我在Application模块中创建了错误页面,它可以工作。

但是,在其他模块中,他们无法使用错误页面。那么我该如何重用错误页面?

这是应用程序模块中的module.config.php文件:

return array(
    ...,
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        '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/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),
);

当我使用以下代码手动返回HTTP 404响应时,会出现问题:

if ( $information == null ) {
    $response = $this->getResponse();
    $response->setStatusCode(404);
    return $response;
}

但是,当我访问http://example.com/something-do-not-exist等非法资源时。我将使用例外The requested URL could not be matched by routing.

访问404错误页面

3 个答案:

答案 0 :(得分:1)

我通过以下代码解决问题:

if ( $information == null ) {
    return $this->notFoundAction();
}

这会将您重定向到全局错误页面。

答案 1 :(得分:0)

为什么其他模块不能使用错误页面?

无论如何,有多种方法可以做到这一点;)

例如,您可以在template_map中为所需的每个错误页面定义多个名称。

答案 2 :(得分:0)

您列出的配置在应用程序模块中是已定义,但该模块的特定。

这是因为在应用程序引导期间,每个module.config.php都是merged together into one configuration array (using array_merge_recursive())。这是您可以使用$serviceManager->get('Config');

获得的配置

因此,配置对应用程序是全局的,并且所有错误(例外)都应使用相同的错误模板(application/view/error/index.phtml)。

但请记住,模块的装载顺序很重要;因为最后加载的模块将始终覆盖现有配置。