NotFoundTemplateHandler.php 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Core\ErrorHandler;
  4. use Fig\Http\Message\StatusCodeInterface;
  5. use InvalidArgumentException;
  6. use Laminas\Diactoros\Response;
  7. use Mezzio\Router\RouteResult;
  8. use Mezzio\Template\TemplateRendererInterface;
  9. use Psr\Http\Message\ResponseInterface;
  10. use Psr\Http\Message\ServerRequestInterface;
  11. use Psr\Http\Server\RequestHandlerInterface;
  12. class NotFoundTemplateHandler implements RequestHandlerInterface
  13. {
  14. public const NOT_FOUND_TEMPLATE = 'ShlinkCore::error/404';
  15. public const INVALID_SHORT_CODE_TEMPLATE = 'ShlinkCore::invalid-short-code';
  16. private TemplateRendererInterface $renderer;
  17. public function __construct(TemplateRendererInterface $renderer)
  18. {
  19. $this->renderer = $renderer;
  20. }
  21. /**
  22. * Dispatch the next available middleware and return the response.
  23. *
  24. *
  25. * @throws InvalidArgumentException
  26. */
  27. public function handle(ServerRequestInterface $request): ResponseInterface
  28. {
  29. /** @var RouteResult $routeResult */
  30. $routeResult = $request->getAttribute(RouteResult::class, RouteResult::fromRouteFailure(null));
  31. $status = StatusCodeInterface::STATUS_NOT_FOUND;
  32. $template = $routeResult->isFailure() ? self::NOT_FOUND_TEMPLATE : self::INVALID_SHORT_CODE_TEMPLATE;
  33. return new Response\HtmlResponse($this->renderer->render($template), $status);
  34. }
  35. }