mirror of
https://github.com/shlinkio/shlink.git
synced 2025-03-27 20:11:34 +03:00
Created default delegate that returns a JSON response when accepted type is json
This commit is contained in:
parent
391ef5c323
commit
566940349f
3 changed files with 65 additions and 5 deletions
|
@ -6,8 +6,10 @@ use Shlinkio\Shlink\Common\Service\PreviewGenerator;
|
||||||
use Shlinkio\Shlink\Core\Action;
|
use Shlinkio\Shlink\Core\Action;
|
||||||
use Shlinkio\Shlink\Core\Middleware;
|
use Shlinkio\Shlink\Core\Middleware;
|
||||||
use Shlinkio\Shlink\Core\Options;
|
use Shlinkio\Shlink\Core\Options;
|
||||||
|
use Shlinkio\Shlink\Core\Response\NotFoundDelegate;
|
||||||
use Shlinkio\Shlink\Core\Service;
|
use Shlinkio\Shlink\Core\Service;
|
||||||
use Zend\Expressive\Router\RouterInterface;
|
use Zend\Expressive\Router\RouterInterface;
|
||||||
|
use Zend\Expressive\Template\TemplateRendererInterface;
|
||||||
use Zend\ServiceManager\AbstractFactory\ConfigAbstractFactory;
|
use Zend\ServiceManager\AbstractFactory\ConfigAbstractFactory;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
@ -15,6 +17,7 @@ return [
|
||||||
'dependencies' => [
|
'dependencies' => [
|
||||||
'factories' => [
|
'factories' => [
|
||||||
Options\AppOptions::class => Options\AppOptionsFactory::class,
|
Options\AppOptions::class => Options\AppOptionsFactory::class,
|
||||||
|
NotFoundDelegate::class => ConfigAbstractFactory::class,
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
Service\UrlShortener::class => ConfigAbstractFactory::class,
|
Service\UrlShortener::class => ConfigAbstractFactory::class,
|
||||||
|
@ -29,9 +32,15 @@ return [
|
||||||
Action\PreviewAction::class => ConfigAbstractFactory::class,
|
Action\PreviewAction::class => ConfigAbstractFactory::class,
|
||||||
Middleware\QrCodeCacheMiddleware::class => ConfigAbstractFactory::class,
|
Middleware\QrCodeCacheMiddleware::class => ConfigAbstractFactory::class,
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'aliases' => [
|
||||||
|
'Zend\Expressive\Delegate\DefaultDelegate' => NotFoundDelegate::class,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
ConfigAbstractFactory::class => [
|
ConfigAbstractFactory::class => [
|
||||||
|
NotFoundDelegate::class => [TemplateRendererInterface::class],
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
Service\UrlShortener::class => ['httpClient', 'em', Cache::class, 'config.url_shortener.shortcode_chars'],
|
Service\UrlShortener::class => ['httpClient', 'em', Cache::class, 'config.url_shortener.shortcode_chars'],
|
||||||
Service\VisitsTracker::class => ['em'],
|
Service\VisitsTracker::class => ['em'],
|
||||||
|
|
54
module/Core/src/Response/NotFoundDelegate.php
Normal file
54
module/Core/src/Response/NotFoundDelegate.php
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\Core\Response;
|
||||||
|
|
||||||
|
use Fig\Http\Message\StatusCodeInterface;
|
||||||
|
use Interop\Http\ServerMiddleware\DelegateInterface;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Zend\Diactoros\Response;
|
||||||
|
use Zend\Expressive\Template\TemplateRendererInterface;
|
||||||
|
|
||||||
|
class NotFoundDelegate implements DelegateInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var TemplateRendererInterface
|
||||||
|
*/
|
||||||
|
private $renderer;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $template;
|
||||||
|
|
||||||
|
public function __construct(TemplateRendererInterface $renderer, string $template = 'ShlinkCore::error/404')
|
||||||
|
{
|
||||||
|
$this->renderer = $renderer;
|
||||||
|
$this->template = $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch the next available middleware and return the response.
|
||||||
|
*
|
||||||
|
* @param ServerRequestInterface $request
|
||||||
|
*
|
||||||
|
* @return ResponseInterface
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function process(ServerRequestInterface $request): ResponseInterface
|
||||||
|
{
|
||||||
|
$accepts = explode(',', $request->getHeaderLine('Accept'));
|
||||||
|
$accept = array_shift($accepts);
|
||||||
|
$status = StatusCodeInterface::STATUS_NOT_FOUND;
|
||||||
|
|
||||||
|
// If the first accepted type is json, return a json response
|
||||||
|
if (in_array($accept, ['application/json', 'text/json', 'application/x-json'], true)) {
|
||||||
|
return new Response\JsonResponse([
|
||||||
|
'error' => 'NOT_FOUND',
|
||||||
|
'message' => 'Not found',
|
||||||
|
], $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response\HtmlResponse($this->renderer->render($this->template, ['request' => $request]), $status);
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ class JsonErrorResponseGenerator implements ErrorResponseGeneratorInterface, Sta
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
* @param Response $response
|
* @param Response $response
|
||||||
* @return Response
|
* @return Response
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
*/
|
*/
|
||||||
public function __invoke($e, Request $request, Response $response)
|
public function __invoke($e, Request $request, Response $response)
|
||||||
{
|
{
|
||||||
|
@ -31,11 +32,7 @@ class JsonErrorResponseGenerator implements ErrorResponseGeneratorInterface, Sta
|
||||||
], $status);
|
], $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected function responsePhraseToCode(string $responsePhrase): string
|
||||||
* @param string $responsePhrase
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function responsePhraseToCode($responsePhrase): string
|
|
||||||
{
|
{
|
||||||
return strtoupper(str_replace(' ', '_', $responsePhrase));
|
return strtoupper(str_replace(' ', '_', $responsePhrase));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue