public function __invoke(Route $route, $err, Http\Request $request, Http\Response $response, callable $next)
{
$handler = $route->handler;
$hasError = null !== $err;
switch (true) {
case $handler instanceof ErrorMiddlewareInterface:
$arity = 4;
break;
case $handler instanceof MiddlewareInterface:
$arity = 3;
break;
default:
$arity = Utils::getArity($handler);
break;
}
// @todo Trigger event with Route, original URL from request?
try {
if ($hasError && $arity === 4) {
return call_user_func($handler, $err, $request, $response, $next);
}
if (!$hasError && $arity < 4) {
return call_user_func($handler, $request, $response, $next);
}
} catch (Exception $e) {
$err = $e;
}
return $next($request, $response, $err);
}