处理抛出的所有异常,使用ZF2将它们放入flashMessage中

时间:2015-04-22 12:58:38

标签: php architecture zend-framework2 standards

我需要正确捕获,在ZF2服务中抛出所有异常并将消息返回给用户的flashMessage。

这是我在Controller操作中尝试的内容:

this.PerformAutoScale();

这就像魅力一样,但我不确定在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)); } 的flash消息。

这被认为是糟糕的架构吗?如果是,我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以在Module.php中捕获所有应用程序的例外情况。在onBootstrap方法中创建事件时,您可以附加一个处理抛出的execption的函数。

所以你会有这样的事情:

//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

希望这可以提供帮助。

答案 1 :(得分:0)

您基本上都在询问是否最好将逻辑放在控制器的操作中或明智地处理此控制器/应用程序。

我说在操作中没问题,因为最终可能会出现一些情况(现在或将来),你需要在应用程序的另一部分以不同的方式处理错误/异常