From d52ab0b1e99aa0c494f389092dce1e926296032d Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 12 Sep 2020 12:42:19 +0200 Subject: Properly handle 404 errors Use 404 template instead of default Slim error page if the route is not found. Fixes #827 --- application/container/ContainerBuilder.php | 4 +++ application/container/ShaarliContainer.php | 9 ++++--- .../controller/visitor/ErrorNotFoundController.php | 29 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 application/front/controller/visitor/ErrorNotFoundController.php (limited to 'application') diff --git a/application/container/ContainerBuilder.php b/application/container/ContainerBuilder.php index 58067c99..55bb51b5 100644 --- a/application/container/ContainerBuilder.php +++ b/application/container/ContainerBuilder.php @@ -10,6 +10,7 @@ use Shaarli\Config\ConfigManager; use Shaarli\Feed\FeedBuilder; use Shaarli\Formatter\FormatterFactory; use Shaarli\Front\Controller\Visitor\ErrorController; +use Shaarli\Front\Controller\Visitor\ErrorNotFoundController; use Shaarli\History; use Shaarli\Http\HttpAccess; use Shaarli\Netscape\NetscapeBookmarkUtils; @@ -149,6 +150,9 @@ class ContainerBuilder ); }; + $container['notFoundHandler'] = function (ShaarliContainer $container): ErrorNotFoundController { + return new ErrorNotFoundController($container); + }; $container['errorHandler'] = function (ShaarliContainer $container): ErrorController { return new ErrorController($container); }; diff --git a/application/container/ShaarliContainer.php b/application/container/ShaarliContainer.php index 9a9a974a..66e669aa 100644 --- a/application/container/ShaarliContainer.php +++ b/application/container/ShaarliContainer.php @@ -24,21 +24,22 @@ use Slim\Container; /** * Extension of Slim container to document the injected objects. * - * @property string $basePath Shaarli's instance base path (e.g. `/shaarli/`) + * @property string $basePath Shaarli's instance base path (e.g. `/shaarli/`) * @property BookmarkServiceInterface $bookmarkService * @property CookieManager $cookieManager * @property ConfigManager $conf - * @property mixed[] $environment $_SERVER automatically injected by Slim - * @property callable $errorHandler Overrides default Slim exception display + * @property mixed[] $environment $_SERVER automatically injected by Slim + * @property callable $errorHandler Overrides default Slim exception display * @property FeedBuilder $feedBuilder * @property FormatterFactory $formatterFactory * @property History $history * @property HttpAccess $httpAccess * @property LoginManager $loginManager * @property NetscapeBookmarkUtils $netscapeBookmarkUtils + * @property callable $notFoundHandler Overrides default Slim exception display * @property PageBuilder $pageBuilder * @property PageCacheManager $pageCacheManager - * @property callable $phpErrorHandler Overrides default Slim PHP error display + * @property callable $phpErrorHandler Overrides default Slim PHP error display * @property PluginManager $pluginManager * @property SessionManager $sessionManager * @property Thumbnailer $thumbnailer diff --git a/application/front/controller/visitor/ErrorNotFoundController.php b/application/front/controller/visitor/ErrorNotFoundController.php new file mode 100644 index 00000000..758dd83b --- /dev/null +++ b/application/front/controller/visitor/ErrorNotFoundController.php @@ -0,0 +1,29 @@ +getRequestTarget(), '/api/v1')) { + return $response->withStatus(404); + } + + // This is required because the middleware is ignored if the route is not found. + $this->container->basePath = rtrim($request->getUri()->getBasePath(), '/'); + + $this->assignView('error_message', t('Requested page could not be found.')); + + return $response->withStatus(404)->write($this->render('404')); + } +} -- cgit v1.2.3