30 lines
975 B
PHP
30 lines
975 B
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace Phred\Http\Middleware;
|
||
|
|
|
||
|
|
use Phred\Support\Config;
|
||
|
|
use Psr\Http\Message\ResponseInterface;
|
||
|
|
use Psr\Http\Message\ServerRequestInterface;
|
||
|
|
use Psr\Http\Server\MiddlewareInterface;
|
||
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
||
|
|
|
||
|
|
class ContentNegotiationMiddleware implements MiddlewareInterface
|
||
|
|
{
|
||
|
|
public const ATTR_API_FORMAT = 'phred.api_format'; // 'rest' | 'jsonapi'
|
||
|
|
|
||
|
|
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
|
||
|
|
{
|
||
|
|
$format = strtolower(Config::get('API_FORMAT', Config::get('api.format', 'rest')));
|
||
|
|
|
||
|
|
// Optional: allow Accept header to override when JSON:API is explicitly requested
|
||
|
|
$accept = $request->getHeaderLine('Accept');
|
||
|
|
if (str_contains($accept, 'application/vnd.api+json')) {
|
||
|
|
$format = 'jsonapi';
|
||
|
|
}
|
||
|
|
|
||
|
|
return $handler->handle($request->withAttribute(self::ATTR_API_FORMAT, $format));
|
||
|
|
}
|
||
|
|
}
|