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

Handle all exceptions thrown, put them into flashMessage with ZF2

我需要正确捕获我在 ZF2 服务中抛出的所有异常,并且 return 将消息发送到用户的 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 中这样做是否好,是否是实现此目的的 better/clean 方法。也许一个事件可以处理这个并创建一个带有 $e->getMessage() 的 flash 消息。

这被认为是糟糕的架构吗?如果是,我该如何正确执行此操作?

你基本上是在问是将逻辑放在控制器的动作中还是明智地处理这个 controller/application 更好。

我会说在操作中很好,因为最终可能会有一些情况(现在或将来)需要在应用程序的另一部分以不同的方式处理 error/exception

您可以在 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