Triggers Zend Framework 2如何在ListenerAggregateInterface中触发MvcEvent

Triggers Zend Framework 2如何在ListenerAggregateInterface中触发MvcEvent,triggers,zend-framework2,listener,Triggers,Zend Framework2,Listener,我想在侦听器中触发错误事件并发送自定义http状态代码(409)-请参阅OneEvent 我已通过侦听器配置附加了侦听器 return [ 'service_manager' => array( 'invokables' => array( 'SendFeedListener' => 'MyModule\Listener\SendFeedListener', ), ), 'listeners' => array( 'SendFeed

我想在侦听器中触发错误事件并发送自定义http状态代码(409)-请参阅OneEvent

我已通过侦听器配置附加了侦听器

return [
'service_manager' => array(
    'invokables' => array(
        'SendFeedListener' => 'MyModule\Listener\SendFeedListener',
    ),
),
'listeners' => array(
    'SendFeedListener',
),
];
我的听众:

class SendFeedListener implements ListenerAggregateInterface, ServiceLocatorAwareInterface
{
use ServiceLocatorAwareTrait, ConfigAwareTrait;

/**
 * @var \Zend\Stdlib\CallbackHandler[]
 */
protected $listeners = [];

public function attach(EventManagerInterface $events)
{
    $sharedEvents = $events->getSharedManager();
    $this->listeners[] = $sharedEvents->attach(
        'MyModule\\Service\\MyService',
        '*', // listen for all events
        array($this, 'onEvent'),
        100
    );
}

...

public function onEvent(EventInterface $e)
{
   // ... some code

   // it went wrong, I want to trigger some error
   if($this->getMyService()->doSomething() == false) {
     $mvcEvent = $this->getServiceLocator()->get('application')->getMvcEvent();
     $this->getServiceLocator()->get('application')
     ->getEventManager()
     ->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $mvcEvent);
   }
 }
...
}
}

我能做的事情如下:

// something went wrong
$sharedEvents = $e->getTarget()->getEventManager()->getSharedManager();
$sharedEvents->attach('Zend\\Mvc\\Application', MvcEvent::EVENT_RENDER,
            array($this, 'errorResponse'), -10000);

public function errorResponse($e)
{
    $response = $e->getResponse();
    $response->setStatusCode(409);
    $response->setContent((new JsonModel($this->error->toArray()))->serialize());
}
但是它看起来非常疯狂

试试这个:

$e->setError('my-custom-error');
$e->getTarget()->getEventManager()->trigger('dispatch.error', $e);
我不确定100%,但如果我没记错的话,您只能在
onRoute
期间和触发
dispatch
之前触发
dispatch.error