4

私のコントローラーでは、次のような If ステートメントの後に 404 応答をスローします。

    if ($foo) {
        $this->getResponse()->setStatusCode(404);
        return; 
    }

次に、いくつかの変数を 404 ページに送信したいと思います。私の心の中で、私はそのようなことをしたいです:

    $this->getResponse()->setVariables(array('foo' => 'bar', 'baz' => 'bop'));
    $this->getResponse()->setStatusCode(404);
    return; 

それは良い解決策ではないので、どうすればいいですか?

その後、これらの変数を 404 ビューで取得する方法は?

ありがとうございました

4

2 に答える 2

1

Google からこの質問にたどり着きましたが、私の問題はもう少し難しいものでした。404 エラーは絶対に予測できない URL からスローされる可能性があるため、何らかのコントローラーでそれをキャッチしたかどうかを確認することはできません。コントローラー – 404 エラーをキャッチするには遅すぎます。

私の場合の解決策は、をキャッチしEVENT_DISPATCH_ERRORて完全に再構築することviewModelでした。Cavern はそのレイアウトです – はルートviewModelであり、デフォルトでレイアウトに追加されるコンテンツは別のものviewModel(子) です。これらの点は、公式ドキュメントに記載されているほど明確ではありません。

これはあなたの中でどのように見えるかですModule.php

public function onBootstrap(MvcEvent $event)
{
    $app = $event->getParam( 'application' );
    $eventManager = $app->getEventManager();


    /** attach Front layout for 404 errors */
    $eventManager->attach( MvcEvent::EVENT_DISPATCH_ERROR, function( MvcEvent $event ){

        /** here you can retrieve anything from your serviceManager */
        $serviceManager = $event->getApplication()->getServiceManager();
        $someVar = $serviceManager->get( 'Some\Factory' )->getSomeValue();

        /** here you redefine layout used to publish an error */
        $layout = $serviceManager->get( 'viewManager' )->getViewModel();
        $layout->setTemplate( 'layout/start' );

        /** here you redefine template used to the error exactly and pass custom variable into ViewModel */
        $viewModel = $event->getResult();
        $viewModel->setVariables( array( 'someVar' => $someVar ) )
                  ->setTemplate( 'error/404' );
    });
}
于 2013-11-06T13:45:39.877 に答える