2015-04-22 2 views
1

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

Это то, что я пытался в своем действии контроллера:

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().

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

ответ

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; ?> 

Может быть, вы могли бы также видеть эту межжала post

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

+0

HUm, от того, что я вижу здесь, это то, что я хотел. Я поддерживаю вас и жду, пока тесты не примут ваш ответ! :) – Hooli

+0

Я создал месяц назад, слушатель для флеш-сообщения, с EVENT_RENDER, я добавил здесь ваше решение handleException, все работает как ожидалось. Но есть ли способ сказать: Эй, я выбрал исключение, но я не хочу показывать вам выделенную страницу с флэш-сообщением, только я хочу показать вам страницу, на которой вы были до того, когда было создано исключение. – Hooli

+0

Если я правильно понял, вы хотите остаться на одной странице и просто показать сообщение, что было создано исключение, верно? Я не уверен, что вы можете сделать это с помощью реального решения. Но, пожалуйста, напишите как новый вопрос, потому что это другая проблема. – blackbishop

0

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

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

+0

Это уже так, я хочу централизовать сообщение моего исключения, чтобы показать их моему пользователю, украшенному флэш-сообщением. – Hooli

Смежные вопросы