ApiPlatform\Core\Hydra\Serializer\PartialCollectionViewNormalizer::normalize PHP Method

normalize() public method

public normalize ( $object, $format = null, array $context = [] )
$context array
    public function normalize($object, $format = null, array $context = [])
    {
        $data = $this->collectionNormalizer->normalize($object, $format, $context);
        if (isset($context['api_sub_level'])) {
            return $data;
        }
        if ($paginated = $object instanceof PaginatorInterface) {
            $currentPage = $object->getCurrentPage();
            $lastPage = $object->getLastPage();
            if (1.0 === $currentPage && 1.0 === $lastPage) {
                // Consider the collection not paginated if there is only one page
                $paginated = false;
            }
        }
        $parsed = IriHelper::parseIri($context['request_uri'] ?? '/', $this->pageParameterName);
        $appliedFilters = $parsed['parameters'];
        unset($appliedFilters[$this->enabledParameterName]);
        if ([] === $appliedFilters && !$paginated) {
            return $data;
        }
        $data['hydra:view'] = ['@id' => IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $paginated ? $currentPage : null), '@type' => 'hydra:PartialCollectionView'];
        if ($paginated) {
            $data['hydra:view']['hydra:first'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, 1.0);
            $data['hydra:view']['hydra:last'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $lastPage);
            if (1.0 !== $currentPage) {
                $data['hydra:view']['hydra:previous'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage - 1.0);
            }
            if ($currentPage !== $lastPage) {
                $data['hydra:view']['hydra:next'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage + 1.0);
            }
        }
        return $data;
    }

Usage Example

 public function testNormalizePaginator()
 {
     $paginatorProphecy = $this->prophesize(PaginatorInterface::class);
     $paginatorProphecy->getCurrentPage()->willReturn(3)->shouldBeCalled();
     $paginatorProphecy->getLastPage()->willReturn(20)->shouldBeCalled();
     $decoratedNormalizerProphecy = $this->prophesize(NormalizerInterface::class);
     $decoratedNormalizerProphecy->normalize(Argument::type(PaginatorInterface::class), null, Argument::type('array'))->willReturn(['hydra:totalItems' => 40, 'foo' => 'bar'])->shouldBeCalled();
     $normalizer = new PartialCollectionViewNormalizer($decoratedNormalizerProphecy->reveal(), '_page');
     $this->assertEquals(['hydra:totalItems' => 40, 'foo' => 'bar', 'hydra:view' => ['@id' => '/?_page=3', '@type' => 'hydra:PartialCollectionView', 'hydra:first' => '/?_page=1', 'hydra:last' => '/?_page=20', 'hydra:previous' => '/?_page=2', 'hydra:next' => '/?_page=4']], $normalizer->normalize($paginatorProphecy->reveal()));
 }