2019-11-23 10:25:12 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace Shlinkio\Shlink\Core\ErrorHandler;
|
|
|
|
|
|
2020-11-22 18:03:27 +01:00
|
|
|
use Closure;
|
2019-11-23 10:25:12 +01:00
|
|
|
use Fig\Http\Message\StatusCodeInterface;
|
2020-01-01 21:11:53 +01:00
|
|
|
use Laminas\Diactoros\Response;
|
|
|
|
|
use Mezzio\Router\RouteResult;
|
2019-11-23 10:25:12 +01:00
|
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
|
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
|
|
|
|
|
2020-11-22 18:03:27 +01:00
|
|
|
use function file_get_contents;
|
|
|
|
|
use function sprintf;
|
|
|
|
|
|
2019-11-23 10:25:12 +01:00
|
|
|
class NotFoundTemplateHandler implements RequestHandlerInterface
|
|
|
|
|
{
|
2020-11-22 18:03:27 +01:00
|
|
|
private const TEMPLATES_BASE_DIR = __DIR__ . '/../../templates';
|
|
|
|
|
public const NOT_FOUND_TEMPLATE = '404.html';
|
|
|
|
|
public const INVALID_SHORT_CODE_TEMPLATE = 'invalid-short-code.html';
|
|
|
|
|
private Closure $readFile;
|
2019-11-23 10:25:12 +01:00
|
|
|
|
2020-11-22 18:03:27 +01:00
|
|
|
public function __construct(?callable $readFile = null)
|
2019-11-23 10:25:12 +01:00
|
|
|
{
|
2020-11-22 18:03:27 +01:00
|
|
|
$this->readFile = $readFile ? Closure::fromCallable($readFile) : fn (string $file) => file_get_contents($file);
|
2019-11-23 10:25:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function handle(ServerRequestInterface $request): ResponseInterface
|
|
|
|
|
{
|
|
|
|
|
/** @var RouteResult $routeResult */
|
2020-11-22 18:03:27 +01:00
|
|
|
$routeResult = $request->getAttribute(RouteResult::class) ?? RouteResult::fromRouteFailure(null);
|
2019-11-23 10:25:12 +01:00
|
|
|
$status = StatusCodeInterface::STATUS_NOT_FOUND;
|
|
|
|
|
|
|
|
|
|
$template = $routeResult->isFailure() ? self::NOT_FOUND_TEMPLATE : self::INVALID_SHORT_CODE_TEMPLATE;
|
2020-11-22 18:03:27 +01:00
|
|
|
$templateContent = ($this->readFile)(sprintf('%s/%s', self::TEMPLATES_BASE_DIR, $template));
|
|
|
|
|
return new Response\HtmlResponse($templateContent, $status);
|
2019-11-23 10:25:12 +01:00
|
|
|
}
|
|
|
|
|
}
|