示例#1
0
 /**
  * @param Request $request
  *
  * @return Response
  */
 public function handle(Request $request)
 {
     $this['app.request'] = $request;
     if ($this->isRequestApi($request->getUri())) {
         $isGranted = $this['api.firewall']->isGranted($request->getMethod(), $request->getUri(), $this['api.user']);
         if (!$isGranted) {
             return new JsonResponse(['code' => Response::HTTP_UNAUTHORIZED, 'message' => 'Unauthorized'], Response::HTTP_UNAUTHORIZED);
         }
     } else {
         $isGranted = $this['app.firewall']->isGranted($request->getMethod(), $request->getUri(), $this['app.user']);
         if (!$isGranted) {
             if ($this['app.user']) {
                 return new Response($this['twig']->render('Error\\index.html.twig', ['code' => Response::HTTP_UNAUTHORIZED, 'message' => 'Unauthorized']), Response::HTTP_UNAUTHORIZED);
             }
             $this['app.session']->set('app.redirect_on_login', $request->getUri());
             return new RedirectResponse('/login');
         }
     }
     try {
         $routeInfo = $this['app.router']->dispatch($request->getMethod(), $request->getUri());
         switch ($routeInfo[0]) {
             case \FastRoute\Dispatcher::NOT_FOUND:
                 return new Response($this['twig']->render('Error\\index.html.twig', ['code' => 404, 'message' => 'Not Found']), Response::HTTP_NOT_FOUND, ['Content-Type' => 'text/html; charset=UTF-8']);
             case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
                 return new Response($this['twig']->render('Error\\index.html.twig', ['code' => 405, 'message' => 'Not Allowed']), Response::HTTP_METHOD_NOT_ALLOWED, ['Content-Type' => 'text/html; charset=UTF-8']);
             case \FastRoute\Dispatcher::FOUND:
             default:
                 $handler = $routeInfo[1];
                 $controller = 'app.controller.' . $handler[0];
                 $method = $handler[1] . 'Action';
                 $this['twig']->addGlobal('app_user', $this['app.user']);
                 return $this[$controller]->{$method}($request, $routeInfo[2]);
         }
     } catch (\Exception $e) {
         $message = $this['debug'] ? $e->getMessage() : 'Internal Server Error';
         return new Response($this['twig']->render('Error\\index.html.twig', ['code' => 500, 'message' => $message]), Response::HTTP_INTERNAL_SERVER_ERROR);
     }
 }