public function onDispatch(MvcEvent $event)
{
$routeMatch = $event->getRouteMatch();
$middleware = $routeMatch->getParam('middleware', false);
if (false === $middleware) {
return;
}
$request = $event->getRequest();
$application = $event->getApplication();
$response = $application->getResponse();
$serviceManager = $application->getServiceManager();
$middlewareName = is_string($middleware) ? $middleware : get_class($middleware);
if (is_string($middleware) && $serviceManager->has($middleware)) {
$middleware = $serviceManager->get($middleware);
}
if (!is_callable($middleware)) {
$return = $this->marshalMiddlewareNotCallable($application::ERROR_MIDDLEWARE_CANNOT_DISPATCH, $middlewareName, $event, $application);
$event->setResult($return);
return $return;
}
$caughtException = null;
try {
$return = $middleware(Psr7Request::fromZend($request), Psr7Response::fromZend($response));
} catch (\Throwable $ex) {
$caughtException = $ex;
} catch (\Exception $ex) {
// @TODO clean up once PHP 7 requirement is enforced
$caughtException = $ex;
}
if ($caughtException !== null) {
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$event->setError($application::ERROR_EXCEPTION);
$event->setController($middlewareName);
$event->setControllerClass(get_class($middleware));
$event->setParam('exception', $caughtException);
$events = $application->getEventManager();
$results = $events->triggerEvent($event);
$return = $results->last();
if (!$return) {
$return = $event->getResult();
}
}
if (!$return instanceof PsrResponseInterface) {
$event->setResult($return);
return $return;
}
$response = Psr7Response::toZend($return);
$event->setResult($response);
return $response;
}