src/EventSubscriber/PaginationHeadersSubscriber.php line 22
<?phpnamespace App\EventSubscriber;use ApiPlatform\State\Pagination\PaginatorInterface;use ApiPlatform\State\Pagination\PartialPaginatorInterface;use ApiPlatform\Util\IriHelper;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpKernel\Event\ResponseEvent;use Symfony\Component\HttpKernel\HttpKernelInterface;use Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\WebLink\GenericLinkProvider;use Symfony\Component\WebLink\Link;class PaginationHeadersSubscriber implements EventSubscriberInterface{public function __construct(private readonly string $paginationParameterName = 'page'){}public function onKernelResponse(ResponseEvent $event): void{if (HttpKernelInterface::MAIN_REQUEST !== $event->getRequestType()) {return;}$request = $event->getRequest();$response = $event->getResponse();$data = $request->attributes->get('data');if (!$data instanceof PartialPaginatorInterface) {return;}$currentPage = (string) $data->getCurrentPage();$response->headers->set('Pagination-Current-Page', $currentPage);$response->headers->set('Pagination-Items-Per-Page', (string) $data->getItemsPerPage());if (!$data instanceof PaginatorInterface) {return;}$lastPage = (string) $data->getLastPage();$response->headers->set('Pagination-Last-Page', $lastPage);$response->headers->set('Pagination-Total-Items', (string) $data->getTotalItems());$linkProvider = $request->attributes->get('_links', new GenericLinkProvider());foreach ($this->collectLinks($request, (int) $currentPage, (int) $lastPage) as $rel => $url) {$linkProvider = $linkProvider->withLink(new Link($rel, $url));}$request->attributes->set('_links', $linkProvider);}public static function getSubscribedEvents(): array{return [KernelEvents::RESPONSE => ['onKernelResponse'],];}/*** @return array<string>*/private function collectLinks(Request $request, int $currentPage, int $lastPage): array{$links = [];$parsed = IriHelper::parseIri($request->getUri(), $this->paginationParameterName);$links['first'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->paginationParameterName, 1);$links['last'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->paginationParameterName, $lastPage);if (1 !== $currentPage) {$links['prev'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->paginationParameterName, (float) $currentPage - 1);}if ($currentPage !== $lastPage) {$links['next'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->paginationParameterName, $currentPage + 1);}return $links;}}