public function normalize($object, $format = null, array $context = [])
{
$data = [];
if (isset($context['api_sub_level'])) {
foreach ($object as $index => $obj) {
$data[$index] = $this->normalizer->normalize($obj, $format, $context);
}
return $data;
}
$resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null, true);
$context = $this->initContext($resourceClass, $context);
$parsed = IriHelper::parseIri($context['request_uri'] ?? '/', $this->pageParameterName);
$paginated = $isPaginator = $object instanceof PaginatorInterface;
if ($isPaginator) {
$currentPage = $object->getCurrentPage();
$lastPage = $object->getLastPage();
$itemsPerPage = $object->getItemsPerPage();
$paginated = 1.0 !== $lastPage;
}
$data = ['_links' => ['self' => IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $paginated ? $currentPage : null)]];
if ($paginated) {
$data['_links']['first'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, 1.0);
$data['_links']['last'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $lastPage);
if (1.0 !== $currentPage) {
$data['_links']['prev'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage - 1.0);
}
if ($currentPage !== $lastPage) {
$data['_links']['next'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage + 1.0);
}
}
foreach ($object as $obj) {
$item = $this->normalizer->normalize($obj, $format, $context);
$data['_embedded']['item'][] = $item;
$data['_links']['item'][] = $item['_links']['self'];
}
if (is_array($object) || $object instanceof \Countable) {
$data['totalItems'] = $object instanceof PaginatorInterface ? (int) $object->getTotalItems() : count($object);
}
if ($isPaginator) {
$data['itemsPerPage'] = (int) $itemsPerPage;
}
return $data;
}
public function testNormalizePaginator() { $paginatorProphecy = $this->prophesize(PaginatorInterface::class); $paginatorProphecy->getCurrentPage()->willReturn(3); $paginatorProphecy->getLastPage()->willReturn(7); $paginatorProphecy->getItemsPerPage()->willReturn(12); $paginatorProphecy->getTotalItems()->willReturn(1312); $paginatorProphecy->rewind()->shouldBeCalled(); $paginatorProphecy->valid()->willReturn(true, false)->shouldBeCalled(); $paginatorProphecy->current()->willReturn('foo')->shouldBeCalled(); $paginatorProphecy->next()->willReturn()->shouldBeCalled(); $paginator = $paginatorProphecy->reveal(); $resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class); $resourceClassResolverProphecy->getResourceClass($paginator, null, true)->willReturn('Foo')->shouldBeCalled(); $itemNormalizer = $this->prophesize(NormalizerInterface::class); $itemNormalizer->normalize('foo', null, ['api_sub_level' => true, 'resource_class' => 'Foo'])->willReturn(['_links' => ['self' => '/me'], 'name' => 'Kévin']); $normalizer = new CollectionNormalizer($resourceClassResolverProphecy->reveal(), 'page'); $normalizer->setNormalizer($itemNormalizer->reveal()); $expected = ['_links' => ['self' => '/?page=3', 'first' => '/?page=1', 'last' => '/?page=7', 'prev' => '/?page=2', 'next' => '/?page=4', 'item' => ['/me']], '_embedded' => ['item' => [['_links' => ['self' => '/me'], 'name' => 'Kévin']]], 'totalItems' => 1312, 'itemsPerPage' => 12]; $this->assertEquals($expected, $normalizer->normalize($paginator)); }