Мне нужно правильно отловить все мои исключения, выданные в моих сервисах 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()
внутрь.
Это считается плохой архитектурой? Если да, как я могу сделать это правильно?
Вы можете поймать все исключения вашего приложения в вашем 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; ?>
Может быть, вы также можете увидеть это интересно сообщение
Надеюсь, это может помочь.
Вы в основном спрашиваете, лучше ли поместить логику в действие контроллера или обрабатывать этот контроллер / приложение мудро.
Я бы сказал, что в действии все хорошо, потому что в конечном итоге могут быть некоторые случаи (сейчас или в будущем), когда вам нужно обрабатывать ошибку / исключение другим способом в другой части приложения.