Intereting Posts
php – Самый быстрый способ проверить наличие текста во многих доменах (более 1000) PHP MongoDb: как установить тайм-аут для выполнения кода Прокрутите каждый ключ и значение многомерного массива php Форма поиска с одним или несколькими (несколькими) параметрами Функция PHP mail () не отправляет электронную почту Как эхо сообщения, если количество строк Как захватить содержимое Facebook Note с помощью Graph API? PHP Включить: проблема с длинным пути Как обработать XML, содержащий пользовательские пространства имен, используя SimpleXML? Как использовать флажки для ввода true (1) или false (0) в mySQL И показывать, как указано в форме php / html? Получить HTML со страницы после POST Как создать ссылку на базу данных в PHP Как использовать рекурсивный итератор массива для обработки многомерного массива? Только отслеживание уникальных посетителей? Результаты петли PDO PHP

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

Мне нужно правильно поймать, все мои исключения, брошенные в мои службы 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; ?> 

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

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

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

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