Обработайте все сгенерированные исключения, поместите их в flashMessage с ZF2

Мне нужно правильно отловить все мои исключения, выданные в моих сервисах ZF2, и вернуть сообщение в flashMessage пользователю.

Вот что я попробовал в своем действии контроллера:

try {
$newConfigID = $this->configService->updateConfig($form->getData());
} catch (\Exception $e) {
$this->flashMessenger()->setNamespace('danger')->addMessage($e->getMessage());
return $this->redirect()->toRoute('config/update', array('idConfig' => $idConfig));
}

Это работает как обаяние, но я не уверен, хорошо ли это делать в Controller, если это лучший / чистый способ добиться этого. Может быть, событие может обработать это и создать флэш-сообщение с $e->getMessage() внутрь.

Это считается плохой архитектурой? Если да, как я могу сделать это правильно?

1

Решение

Вы можете поймать все исключения вашего приложения в вашем Module.php, Когда событие создается в вашем onBootstrap Метод, вы можете прикрепить функцию, которая будет обрабатывать выброшенные исключения.

Итак, у вас будет что-то вроде этого:

//file : Module.php

public function onBootstrap(MvcEvent $event)
{
$em= $event->getApplication()->getEventManager();
$em->attach(\Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'handleException']);
$em->attach(\Zend\Mvc\MvcEvent::EVENT_RENDER_ERROR, [$this, 'handleException']);
}

public function handleException(MvcEvent $event)
{
$e= $event->getParam('exception');
$flashMessenger = new FlashMessenger();
$flashMessenger->setNamespace('error');
$flashMessenger->addMessage($e->getMessage());

$event->getViewModel()->setVariable('flashMessages', $flashMessenger->getMessages());

}

По вашему мнению (в основном в layout.phtml):

<?php if(isset($flashMessages)) : ?>
<ul class="errors">
<?php foreach ($flashMessages as $flashMessage) : ?>
<li><?php echo $flashMessage; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>

Может быть, вы также можете увидеть это интересно сообщение

Надеюсь, это может помочь.

1

Другие решения

Вы в основном спрашиваете, лучше ли поместить логику в действие контроллера или обрабатывать этот контроллер / приложение мудро.

Я бы сказал, что в действии все хорошо, потому что в конечном итоге могут быть некоторые случаи (сейчас или в будущем), когда вам нужно обрабатывать ошибку / исключение другим способом в другой части приложения.

0

По вопросам рекламы [email protected]