From 9e06a69f28f48e05f6130405edf2912dfc8cebd3 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Fri, 6 Aug 2021 12:30:00 +0200 Subject: [PATCH] BUGFIX: added error pages --- config/routes.yaml | 6 +++++ lib/Framework/Router.php | 39 ++++++++++++++++++---------- src/Controller/DefaultController.php | 12 +++++++++ src/Repository/Page.php | 5 ++-- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/config/routes.yaml b/config/routes.yaml index 8008419..13eaa55 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,3 +1,9 @@ +error: + path: '/error/{status}' + defaults: + _controller: JeroenED\Website\Controller\DefaultController::ErrorAction + status: '404' + default: path: '/{page}' defaults: diff --git a/lib/Framework/Router.php b/lib/Framework/Router.php index a108684..a27e9b3 100644 --- a/lib/Framework/Router.php +++ b/lib/Framework/Router.php @@ -6,8 +6,10 @@ namespace JeroenED\Framework; use Symfony\Component\Config\FileLocator; use Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\Loader\YamlFileLoader; use Symfony\Component\Routing\Matcher\UrlMatcher; @@ -21,21 +23,30 @@ class Router public function route(Request $request, Kernel $kernel): Response { - $requestContext = new RequestContext(); - $this->requestContext = $requestContext->fromRequest($request); - $matcher = new UrlMatcher($this->routes, $this->requestContext); - $method = $matcher->match($request->getPathInfo()); - $controller = explode('::', $method['_controller']); - $controllerObj = new ('\\' . $controller[0])($request, $kernel); - $action = $controller[1]; - unset($method['_controller']); - unset($method['_route']); - $response = $controllerObj->$action(...$method); + try { + // Here be dragons - if ($response instanceof Response) { - return $response; - } else { - throw new InvalidArgumentException(); + $requestContext = new RequestContext(); + $this->requestContext = $requestContext->fromRequest($request); + $matcher = new UrlMatcher($this->routes, $this->requestContext); + $method = $matcher->match($request->getPathInfo()); + $controller = explode('::', $method['_controller']); + $controllerObj = new ('\\' . $controller[0])($request, $kernel); + $action = $controller[1]; + unset($method['_controller']); + unset($method['_route']); + + $response = $controllerObj->$action(...$method); + + if ($response instanceof Response) { + return $response; + } else { + throw new InvalidArgumentException(); + } + } catch(ResourceNotFoundException $e) { + return new RedirectResponse($this->getUrlForRoute('error', ['status' => '404'])); + } catch (\Throwable $e) { + return new RedirectResponse($this->getUrlForRoute('error', ['status' => (method_exists($e,'getStatusCode')) ? $e->getStatusCode() : '500'])); } } diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php index fca2dc5..c1c99b0 100644 --- a/src/Controller/DefaultController.php +++ b/src/Controller/DefaultController.php @@ -22,4 +22,16 @@ class DefaultController extends Controller 'nineties' => (isset($_COOKIE['nineties'])) ], $page['status']); } + + public function ErrorAction($status) + { + $pageRepo = new Page(); + $page = $pageRepo->getPage('error/' . $status); + return $this->render('/page.html.twig', [ + 'header' => $page['header'], + 'content' => $page['content'], + 'title' => $page['title'], + 'nineties' => (isset($_COOKIE['nineties'])) + ], $status); + } } \ No newline at end of file diff --git a/src/Repository/Page.php b/src/Repository/Page.php index 637068b..9194dfb 100644 --- a/src/Repository/Page.php +++ b/src/Repository/Page.php @@ -9,6 +9,7 @@ use GuzzleHttp\Client; use JeroenED\Framework\Repository; use phpseclib3\Crypt\PublicKeyLoader; use phpseclib3\Net\SSH2; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class Page { @@ -28,9 +29,7 @@ class Page $return['content'] = file_get_contents(strtolower($this->root . '/' . $page . '.md')); $return['status'] = '200'; } else { - $return['title'] = $titles['404'] ?? ''; - $return['content'] = file_get_contents(strtolower($this->root . '/404.md')); - $return['status'] = '404'; + throw new NotFoundHttpException(); } return $return; }