Установите переменные в 404 в zend framework 2

76

В моем контроллере я выдаю ответ 404 после инструкции If, что-то вроде этого:


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

Затем я хотел бы отправить некоторые переменные на мою страницу 404. На мой взгляд, я хочу сделать что-то подобное:


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

Это нехорошее решение, так как я должен это делать?


И после, как получить эти переменные в моем представлении 404?


Спасибо

спросил(а) 2013-05-31T11:16:00+04:00 7 лет, 2 месяца назад
1
Решение
87

О боже..


Я был таким глупым


Решение:

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

В 404.phtml:


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

ответил(а) 2013-05-31T12:15:00+04:00 7 лет, 2 месяца назад
39

Я пришел к этому вопросу от Google, и моя проблема была немного сложнее. Поскольку ошибка 404 может быть выброшена из абсолютно непредсказуемого URL-адреса, вы не можете быть уверены, что вы поймали его в каком-то контроллере. Контроллер - слишком поздно, чтобы поймать ошибку 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-06T16:45:00+04:00 6 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема