vendor/api-platform/core/src/Core/EventListener/ReadListener.php line 54

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\Core\EventListener;
  12. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  13. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  14. use ApiPlatform\Core\DataProvider\OperationDataProviderTrait;
  15. use ApiPlatform\Core\DataProvider\SubresourceDataProviderInterface;
  16. use ApiPlatform\Core\Identifier\IdentifierConverterInterface;
  17. use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
  18. use ApiPlatform\Core\Metadata\Resource\ToggleableOperationAttributeTrait;
  19. use ApiPlatform\Exception\InvalidIdentifierException;
  20. use ApiPlatform\Exception\RuntimeException;
  21. use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
  22. use ApiPlatform\Serializer\SerializerContextBuilderInterface;
  23. use ApiPlatform\Symfony\EventListener\ReadListener as SymfonyReadListener;
  24. use ApiPlatform\Util\CloneTrait;
  25. use ApiPlatform\Util\OperationRequestInitiatorTrait;
  26. use ApiPlatform\Util\RequestAttributesExtractor;
  27. use ApiPlatform\Util\RequestParser;
  28. use Symfony\Component\HttpKernel\Event\RequestEvent;
  29. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  30. /**
  31.  * Retrieves data from the applicable data provider and sets it as a request parameter called data.
  32.  *
  33.  * @author Kévin Dunglas <dunglas@gmail.com>
  34.  *
  35.  * @deprecated
  36.  */
  37. final class ReadListener
  38. {
  39.     use CloneTrait;
  40.     use OperationDataProviderTrait;
  41.     use OperationRequestInitiatorTrait;
  42.     use ToggleableOperationAttributeTrait;
  43.     public const OPERATION_ATTRIBUTE_KEY 'read';
  44.     private $serializerContextBuilder;
  45.     private $metadataBackwardCompatibilityLayer;
  46.     public function __construct(CollectionDataProviderInterface $collectionDataProviderItemDataProviderInterface $itemDataProviderSubresourceDataProviderInterface $subresourceDataProvider nullSerializerContextBuilderInterface $serializerContextBuilder nullIdentifierConverterInterface $identifierConverter nullResourceMetadataFactoryInterface $resourceMetadataFactory nullResourceMetadataCollectionFactoryInterface $resourceMetadataCollectionFactory nullbool $metadataBackwardCompatibilityLayer null)
  47.     {
  48.         $this->collectionDataProvider $collectionDataProvider;
  49.         $this->itemDataProvider $itemDataProvider;
  50.         $this->subresourceDataProvider $subresourceDataProvider;
  51.         $this->serializerContextBuilder $serializerContextBuilder;
  52.         $this->identifierConverter $identifierConverter;
  53.         $this->resourceMetadataFactory $resourceMetadataFactory;
  54.         $this->resourceMetadataCollectionFactory $resourceMetadataCollectionFactory;
  55.         $this->metadataBackwardCompatibilityLayer $metadataBackwardCompatibilityLayer;
  56.         if ($metadataBackwardCompatibilityLayer || null === $metadataBackwardCompatibilityLayer) {
  57.             trigger_deprecation('api-platform/core''2.7'sprintf('The listener "%s" is deprecated and will be replaced by "%s" in 3.0.'__CLASS__SymfonyReadListener::class));
  58.         }
  59.     }
  60.     /**
  61.      * Calls the data provider and sets the data attribute.
  62.      *
  63.      * @throws NotFoundHttpException
  64.      */
  65.     public function onKernelRequest(RequestEvent $event): void
  66.     {
  67.         $request $event->getRequest();
  68.         $operation $this->initializeOperation($request);
  69.         if (
  70.             !($attributes RequestAttributesExtractor::extractAttributes($request))
  71.             || !$attributes['receive']
  72.             || ($request->isMethod('POST') && isset($attributes['collection_operation_name']))
  73.             || ($operation && !($operation->getExtraProperties()['is_legacy_resource_metadata'] ?? false) && !($operation->getExtraProperties()['is_legacy_subresource'] ?? false))
  74.             || ($operation && false === $operation->canRead())
  75.             || $this->isOperationAttributeDisabled($attributesself::OPERATION_ATTRIBUTE_KEY)
  76.         ) {
  77.             return;
  78.         }
  79.         if (false === $this->metadataBackwardCompatibilityLayer) {
  80.             trigger_deprecation('api-platform/core''2.7''The operation you requested uses legacy metadata, switch to #[ApiPlatform\Metadata\ApiResource].');
  81.         }
  82.         if (null === $filters $request->attributes->get('_api_filters')) {
  83.             $queryString RequestParser::getQueryString($request);
  84.             $filters $queryString RequestParser::parseRequestParams($queryString) : null;
  85.         }
  86.         $context null === $filters ? [] : ['filters' => $filters];
  87.         if ($this->serializerContextBuilder) {
  88.             // Builtin data providers are able to use the serialization context to automatically add join clauses
  89.             $context += $normalizationContext $this->serializerContextBuilder->createFromRequest($requesttrue$attributes);
  90.             $request->attributes->set('_api_normalization_context'$normalizationContext);
  91.         }
  92.         if (isset($attributes['collection_operation_name'])) {
  93.             $request->attributes->set('data'$this->getCollectionData($attributes$context));
  94.             return;
  95.         }
  96.         $data = [];
  97.         if ($this->identifierConverter) {
  98.             $context[IdentifierConverterInterface::HAS_IDENTIFIER_CONVERTER] = true;
  99.         }
  100.         try {
  101.             $identifiers $this->extractIdentifiers($request->attributes->all(), $attributes);
  102.             if (isset($attributes['item_operation_name'])) {
  103.                 $data $this->getItemData($identifiers$attributes$context);
  104.             } elseif (isset($attributes['subresource_operation_name'])) {
  105.                 // Legacy
  106.                 if (null === $this->subresourceDataProvider) {
  107.                     throw new RuntimeException('No subresource data provider.');
  108.                 }
  109.                 $data $this->getSubresourceData($identifiers$attributes$context);
  110.             }
  111.         } catch (InvalidIdentifierException $e) {
  112.             throw new NotFoundHttpException('Invalid identifier value or configuration.'$e);
  113.         }
  114.         if (null === $data) {
  115.             throw new NotFoundHttpException('Not Found');
  116.         }
  117.         $request->attributes->set('data'$data);
  118.         $request->attributes->set('previous_data'$this->clone($data));
  119.     }
  120. }