UrlRouter.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace KarmaFW\App\Middlewares;
  3. use \KarmaFW\App;
  4. use \KarmaFW\Http\Request;
  5. use \KarmaFW\Http\Response;
  6. use \KarmaFW\Routing\Router;
  7. class UrlRouter
  8. {
  9. protected $catch_exceptions;
  10. public function __construct($catch_exceptions=false)
  11. {
  12. $this->catch_exceptions = $catch_exceptions;
  13. }
  14. public function __invoke(Request $request, Response $response, callable $next)
  15. {
  16. // LOAD ROUTES
  17. if (is_file(FW_DIR . '/config/routes.php')) {
  18. require FW_DIR . '/config/routes.php';
  19. }
  20. if (is_file(APP_DIR . '/config/routes.php')) {
  21. require APP_DIR . '/config/routes.php';
  22. }
  23. try {
  24. $router = new Router;
  25. ob_start();
  26. $route_response = Router::routeRequest($request, $response);
  27. // en principe le contenu de la reponse est dans $response->content
  28. // mais si il y a eu des "echo", ils sont capturés par le ob_start puis insérés au début de $response->content
  29. $content = ob_get_contents();
  30. ob_end_clean();
  31. if (! empty($route_response) && is_a($route_response, Response::class)) {
  32. $response = $route_response;
  33. }
  34. $response->prepend($content); // on ajoute ici le texte capturé pendant l'execution de la route
  35. $response = $next($request, $response);
  36. } catch (\Exception $e) {
  37. $error_code = $e->getCode();
  38. $error_message = $e->getMessage();
  39. // TODO: voir comment bien injecter cette dependance
  40. $debugbar = App::getData('debugbar');
  41. if ($debugbar) {
  42. if (isset($debugbar['exceptions'])) {
  43. $debugbar['exceptions']->addException($e);
  44. }
  45. }
  46. // REDIRECTION
  47. if (in_array($error_code, [301, 302, 310])) {
  48. // if $error_code is a redirection
  49. $url = $error_message;
  50. //return new ResponseRedirect($url, $error_code);
  51. return $response->redirect($url, $error_code);
  52. }
  53. // ERROR 404
  54. if (in_array($error_code, [404, 410])) {
  55. // if $error_code is a 404 page not found
  56. if (empty($error_message)) {
  57. $error_message = '<title>Not Found</title><h1>Not Found</h1><p>Page not Found</p>';
  58. }
  59. return $response->setHtml($error_message, $error_code);
  60. }
  61. // ERROR 500
  62. if (! $this->catch_exceptions) {
  63. // on relance l'exception => pour laisser la gestion de l'erreur à un handler parent (ou le error_handler par defaut de PHP)
  64. throw $e;
  65. }
  66. error_log("[UrlRouter] Error 500 : " . $error_message);
  67. if (ENV == 'dev') {
  68. $title = "UrlRouter CATCHED EXCEPTION CODE " . $error_code;
  69. $message = '<pre>' . print_r($e, true) . '</pre>';
  70. $response_content = '<title>' . $title . '</title><h1>' . $title . '</h1><h2>' . $error_message . '</h2><p>' . $message . '</p>';
  71. } else {
  72. $title = "Server Error";
  73. $message = 'An error has occured';
  74. $response_content = '<title>' . $title . '</title><h1>' . $title . '</h1><p>' . $message . '</p>';
  75. }
  76. // else => error 500
  77. $response->setHtml($response_content, 500);
  78. }
  79. return $response;
  80. }
  81. }