/** * Dispatch a request on the controller. * * @param Request $request * @return Response * @throws InvalidActionReturnValueException */ public function dispatch(Request $request) : Response { $action = $request->param('action'); $params = $request->params["arguments"] + ["request" => $request]; $closure = function () use($action, $params) { return $this->callAction($action, $params); }; $middlewares = array_reverse($this->_middlewareRegistry); foreach ($middlewares as $middleware) { $closure = function (Request $request) use($middleware, $closure) { return $middleware->handle($request, $closure); }; } $response = $closure($request); if (!$response instanceof Response) { throw new InvalidActionReturnValueException([get_called_class() . '::' . $action]); } return $response; }