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