public function handle(Request $request) { $context = new RequestContext(); $context->fromRequest($request); $matcher = new UrlMatcher($this->routes, $context); try { $parameters = $matcher->match($request->getPathInfo()); $vm = $this->controller($parameters); } catch (ResourceNotFoundException $e) { $viewData = ['error' => 'NotFoundException', 'message' => 'You are accessing not existing page, please choose one of available feeds', 'available_feeds' => []]; foreach ($this->routes as $route) { $viewData['available_feeds'][] = $route->getPattern(); } $vm = new ViewModel($viewData, 404); } if (isset($parameters['_format'])) { switch ($parameters['_format']) { case 'xml': $renderer = new Renderer\XML(); break; case 'json': default: $renderer = new Renderer\JSON(); } } else { $renderer = new Renderer\JSON(); } $response = new Response(); $response->setStatusCode($vm->getStatusCode()); $renderer->render($response, $vm); $headers = []; foreach ($response->headers as $k => $v) { $headers[$k] = $v[0]; } return $response; }