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

4

天啊..

我太笨了

解决方案 :

if ($foo) {
    $this->getResponse()->setStatusCode(404);
    return array('myvar' => 'test');
}

在 404.phtml 中:

<?php echo $this->myvar; ?>
于 2013-05-31T09:15:26.503 回答
1

我从谷歌来了这个问题,我的问题有点困难。由于绝对不可预测的 url 可能会引发 404 错误,因此您无法确定是否在某些控制器中捕获了它。控制器 - 捕捉 404 错误为时已晚。

在我的情况下,解决方案是捕获EVENT_DISPATCH_ERROR并完全重建viewModel. Cavern 是那个布局 - 是一个 root 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 回答