0

Zend アプリケーションに多くのモジュールがあります。すべてのモジュールでエラーと例外が発生しますよね? そのため、アプリケーション モジュールでエラー ページを作成すると、機能します。

ただし、他のモジュールでは、エラー ページを使用できません。では、エラー ページを再利用するにはどうすればよいでしょうか。

アプリケーションモジュールの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のような違法なリソースにアクセスすると。例外のある 404 エラー ページに到達しますThe requested URL could not be matched by routing.

4

3 に答える 3

1

次のコードで問題を解決します。

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

これにより、グローバル エラー ページにリダイレクトされます。

于 2014-02-07T10:05:08.757 に答える
0

他のモジュールがエラー ページを使用できないのはなぜですか?

とにかく、それを行うには複数の方法があります;)

たとえば、必要なエラー ページごとに template_map で複数の名前を定義できます。

于 2014-02-07T08:44:06.963 に答える
0

リストした構成はアプリケーション モジュールで定義されていますが、そのモジュールに固有のものではありません。

これは、アプリケーションのブートストラップ中に、それぞれmodule.config.phpが( を使用して) 1 つの構成配列にマージされるarray_merge_recursive()ためです。これは、使用して取得できる構成です$serviceManager->get('Config');

したがって、構成はアプリケーションに対してグローバルであり、すべてのエラー (例外) は同じエラー テンプレート ( application/view/error/index.phtml) を使用する必要があります。

ただし、モジュールのロード順序が重要であることに注意してください。モジュールを最後にロードすると、常に既存の構成が上書きされるためです。

于 2014-02-07T08:44:59.047 に答える