ApiPlatform\Core\Hydra\Serializer\CollectionFiltersNormalizer::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;
        }
        $resourceClass = $this->resourceClassResolver->getResourceClass($object, $context['resource_class'] ?? null, true);
        $resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
        $operationName = $context['collection_operation_name'] ?? null;
        if (null === $operationName) {
            $resourceFilters = $resourceMetadata->getAttribute('filters', []);
        } else {
            $resourceFilters = $resourceMetadata->getCollectionOperationAttribute($operationName, 'filters', [], true);
        }
        if ([] === $resourceFilters) {
            return $data;
        }
        $requestParts = parse_url($context['request_uri'] ?? '');
        if (!is_array($requestParts)) {
            return $data;
        }
        $currentFilters = [];
        foreach ($this->filters as $filterName => $filter) {
            if (in_array($filterName, $resourceFilters)) {
                $currentFilters[] = $filter;
            }
        }
        if ([] !== $currentFilters) {
            $data['hydra:search'] = $this->getSearch($resourceClass, $requestParts, $currentFilters);
        }
        return $data;
    }

Usage Example

 public function testNormalize()
 {
     $dummy = new Dummy();
     $decorated = $this->prophesize(NormalizerInterface::class);
     $decorated->normalize($dummy, null, ['request_uri' => '/foo?bar=baz'])->willReturn(['name' => 'foo'])->shouldBeCalled();
     $resourceMetadataFactory = $this->prophesize(ResourceMetadataFactoryInterface::class);
     $resourceMetadataFactory->create(Dummy::class)->willReturn(new ResourceMetadata('foo', '', null, [], [], ['filters' => ['foo']]));
     $resourceClassResolver = $this->prophesize(ResourceClassResolverInterface::class);
     $resourceClassResolver->getResourceClass($dummy, null, true)->willReturn(Dummy::class)->shouldBeCalled();
     $filter = $this->prophesize(FilterInterface::class);
     $filter->getDescription(Dummy::class)->willReturn(['a' => ['property' => 'name', 'required' => true]])->shouldBeCalled();
     $normalizer = new CollectionFiltersNormalizer($decorated->reveal(), $resourceMetadataFactory->reveal(), $resourceClassResolver->reveal(), new FilterCollection([$filter->reveal()]));
     $this->assertEquals(['name' => 'foo', 'hydra:search' => ['@type' => 'hydra:IriTemplate', 'hydra:template' => '/foo{?a}', 'hydra:variableRepresentation' => 'BasicRepresentation', 'hydra:mapping' => [['@type' => 'IriTemplateMapping', 'variable' => 'a', 'property' => 'name', 'required' => true]]]], $normalizer->normalize($dummy, null, ['request_uri' => '/foo?bar=baz']));
 }