ApiPlatform\Core\Hal\Serializer\CollectionNormalizer::normalize PHP Method

normalize() public method

public normalize ( $object, $format = null, array $context = [] )
$context array
    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;
    }

Usage Example

 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));
 }