3

在我控制我拋出一個如果語句後404響應,類似的東西:設置變量,以404中的Zend Framework 2

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

然後,我想一些變量發送給我的404頁。在我看來,我想要這樣做:

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

這不是一個好的解決方案,所以我該怎麼做呢?

而之後,如何在我的404視圖中獲取這些變量?

謝謝

回答

4

天啊..

我是如此愚蠢

解決方案:

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

在404.phtml:

<?php echo $this->myvar; ?> 
+0

爲ZF1是$這個 - > GETRESPONSE() - > setHttpResponseCode(404); – chrisweb

0

我已經來這個問題從谷歌和我的問題是有點困難。由於404錯誤可能會從絕對不可預知的URL中拋出,因此您無法確定是否在某些控制器中捕獲了它。控制器 - 爲時已晚,無法捕獲404錯誤。

我的解決方案是趕上EVENT_DISPATCH_ERROR並完全重建viewModel。洞穴是那個佈局 - 是一個根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'); 
    }); 
}