处理所有抛出的异常,用 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
我需要正确捕获我在 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