vendor/api-platform/core/src/Symfony/EventListener/JsonApi/TransformFieldsetsParametersListener.php line 44

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace ApiPlatform\Symfony\EventListener\JsonApi;
  12. use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
  13. use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
  14. use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
  15. use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
  16. use Symfony\Component\HttpKernel\Event\RequestEvent;
  17. /**
  18.  * @see http://jsonapi.org/format/#fetching-sparse-fieldsets
  19.  * @see https://api-platform.com/docs/core/filters#property-filter
  20.  *
  21.  * @author Baptiste Meyer <baptiste.meyer@gmail.com>
  22.  */
  23. final class TransformFieldsetsParametersListener
  24. {
  25.     /**
  26.      * @var ResourceMetadataFactoryInterface|ResourceMetadataCollectionFactoryInterface
  27.      */
  28.     private $resourceMetadataFactory;
  29.     public function __construct($resourceMetadataFactory)
  30.     {
  31.         $this->resourceMetadataFactory $resourceMetadataFactory;
  32.         if (!$resourceMetadataFactory instanceof ResourceMetadataCollectionFactoryInterface) {
  33.             trigger_deprecation('api-platform/core''2.7'sprintf('Use "%s" instead of "%s".'ResourceMetadataCollectionFactoryInterface::class, ResourceMetadataFactoryInterface::class));
  34.         }
  35.     }
  36.     public function onKernelRequest(RequestEvent $event): void
  37.     {
  38.         $request $event->getRequest();
  39.         $queryParameters $request->query->all();
  40.         $includeParameter $queryParameters['include'] ?? null;
  41.         $fieldsParameter $queryParameters['fields'] ?? null;
  42.         if (
  43.             (!$fieldsParameter && !$includeParameter) ||
  44.             ($fieldsParameter && !\is_array($fieldsParameter)) ||
  45.             (!\is_string($includeParameter)) ||
  46.             'jsonapi' !== $request->getRequestFormat() ||
  47.             !($resourceClass $request->attributes->get('_api_resource_class'))
  48.         ) {
  49.             return;
  50.         }
  51.         $includeParameter explode(','$includeParameter);
  52.         if (!$fieldsParameter) {
  53.             $request->attributes->set('_api_included'$includeParameter);
  54.             return;
  55.         }
  56.         /** @var ResourceMetadata|ResourceMetadataCollection */
  57.         $resourceMetadata $this->resourceMetadataFactory->create($resourceClass);
  58.         $resourceShortName $resourceMetadata instanceof ResourceMetadata $resourceMetadata->getShortName() : $resourceMetadata->getOperation()->getShortName();
  59.         $properties = [];
  60.         foreach ($fieldsParameter as $resourceType => $fields) {
  61.             $fields explode(','$fields);
  62.             if ($resourceShortName === $resourceType) {
  63.                 $properties array_merge($properties$fields);
  64.             } elseif (\in_array($resourceType$includeParametertrue)) {
  65.                 $properties[$resourceType] = $fields;
  66.                 $request->attributes->set('_api_included'array_merge($request->attributes->get('_api_included', []), [$resourceType]));
  67.             } else {
  68.                 $properties[$resourceType] = $fields;
  69.             }
  70.         }
  71.         $request->attributes->set('_api_filter_property'$properties);
  72.     }
  73. }
  74. class_alias(TransformFieldsetsParametersListener::class, \ApiPlatform\Core\JsonApi\EventListener\TransformFieldsetsParametersListener::class);