diff --git a/src/Core/Api/OperationType.php b/src/Core/Api/OperationType.php index 8d303cf46b..f1daa8b016 100644 --- a/src/Core/Api/OperationType.php +++ b/src/Core/Api/OperationType.php @@ -13,10 +13,6 @@ namespace ApiPlatform\Core\Api; -use ApiPlatform\Metadata\Operation; - -trigger_deprecation('api-platform', '2.7', sprintf('%s is deprecated, an operation can be a collection using the %s::collection property.', OperationType::class, Operation::class)); - final class OperationType { public const ITEM = 'item'; diff --git a/src/Core/Bridge/Symfony/Messenger/DataPersister.php b/src/Core/Bridge/Symfony/Messenger/DataPersister.php index 8dbc6fc295..f2b13d85a7 100644 --- a/src/Core/Bridge/Symfony/Messenger/DataPersister.php +++ b/src/Core/Bridge/Symfony/Messenger/DataPersister.php @@ -19,6 +19,7 @@ use ApiPlatform\Exception\OperationNotFoundException; use ApiPlatform\Exception\ResourceClassNotFoundException; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; +use ApiPlatform\Symfony\Messenger\DispatchTrait; use ApiPlatform\Util\ClassInfoTrait; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; diff --git a/src/Core/Metadata/Property/Factory/AnnotationPropertyMetadataFactory.php b/src/Core/Metadata/Property/Factory/AnnotationPropertyMetadataFactory.php index 7332f1a412..0ee92be29f 100644 --- a/src/Core/Metadata/Property/Factory/AnnotationPropertyMetadataFactory.php +++ b/src/Core/Metadata/Property/Factory/AnnotationPropertyMetadataFactory.php @@ -40,6 +40,10 @@ public function __construct(Reader $reader = null, PropertyMetadataFactoryInterf */ public function create(string $resourceClass, string $property, array $options = []): PropertyMetadata { + if (false === ($options['deprecate'] ?? null)) { + trigger_deprecation('api-platform/core', '2.7', sprintf('Decorating the legacy %s is deprecated, use %s instead.', PropertyMetadataFactoryInterface::class, \ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface::class)); + } + $parentPropertyMetadata = null; if ($this->decorated) { try { diff --git a/src/Core/Metadata/Property/Factory/AnnotationSubresourceMetadataFactory.php b/src/Core/Metadata/Property/Factory/AnnotationSubresourceMetadataFactory.php index 7355747cb9..5b2918a8a7 100644 --- a/src/Core/Metadata/Property/Factory/AnnotationSubresourceMetadataFactory.php +++ b/src/Core/Metadata/Property/Factory/AnnotationSubresourceMetadataFactory.php @@ -36,8 +36,6 @@ public function __construct(Reader $reader, PropertyMetadataFactoryInterface $de { $this->reader = $reader; $this->decorated = $decorated; - - trigger_deprecation('api-platform/core', '2.7', 'Use alternate urls instead of declaring subresources on properties.'); } /** @@ -62,6 +60,8 @@ public function create(string $resourceClass, string $property, array $options = $annotation = $this->reader->getPropertyAnnotation($reflectionProperty, ApiSubresource::class); if ($annotation instanceof ApiSubresource) { + trigger_deprecation('api-platform/core', '2.7', sprintf('Declare a new resource instead of using ApiSubresource on the property "%s".', $property)); + return $this->updateMetadata($annotation, $propertyMetadata, $resourceClass, $property); } } diff --git a/src/Core/Metadata/Property/Factory/SerializerPropertyMetadataFactory.php b/src/Core/Metadata/Property/Factory/SerializerPropertyMetadataFactory.php index 5cfb852d3c..9c93b2051a 100644 --- a/src/Core/Metadata/Property/Factory/SerializerPropertyMetadataFactory.php +++ b/src/Core/Metadata/Property/Factory/SerializerPropertyMetadataFactory.php @@ -16,8 +16,8 @@ use ApiPlatform\Core\Api\ResourceClassResolverInterface; use ApiPlatform\Core\Metadata\Property\PropertyMetadata; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; -use ApiPlatform\Core\Util\ResourceClassInfoTrait; use ApiPlatform\Exception\ResourceClassNotFoundException; +use ApiPlatform\Util\ResourceClassInfoTrait; use Symfony\Component\PropertyInfo\Type; use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface as SerializerClassMetadataFactoryInterface; diff --git a/src/Core/Swagger/Serializer/DocumentationNormalizer.php b/src/Core/Swagger/Serializer/DocumentationNormalizer.php index cd991c0b33..dd7ad7a92e 100644 --- a/src/Core/Swagger/Serializer/DocumentationNormalizer.php +++ b/src/Core/Swagger/Serializer/DocumentationNormalizer.php @@ -13,8 +13,8 @@ namespace ApiPlatform\Core\Swagger\Serializer; +use ApiPlatform\Api\FilterLocatorTrait; use ApiPlatform\Core\Api\FilterCollection; -use ApiPlatform\Core\Api\FilterLocatorTrait; use ApiPlatform\Core\Api\FormatsProviderInterface; use ApiPlatform\Core\Api\IdentifiersExtractorInterface; use ApiPlatform\Core\Api\OperationAwareFormatsProviderInterface; @@ -38,6 +38,7 @@ use ApiPlatform\JsonSchema\TypeFactoryInterface; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; use ApiPlatform\OpenApi\OpenApi; +use ApiPlatform\OpenApi\Serializer\ApiGatewayNormalizer; use ApiPlatform\PathResolver\OperationPathResolverInterface; use Psr\Container\ContainerInterface; use Symfony\Component\PropertyInfo\Type; diff --git a/src/Doctrine/Common/State/Processor.php b/src/Doctrine/Common/State/Processor.php index 0604c95416..bcb414f9e7 100644 --- a/src/Doctrine/Common/State/Processor.php +++ b/src/Doctrine/Common/State/Processor.php @@ -31,7 +31,7 @@ public function __construct(ManagerRegistry $managerRegistry) $this->managerRegistry = $managerRegistry; } - public function supports($data, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports($data, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { return null !== $this->getManager($data); } @@ -62,7 +62,7 @@ private function remove($data, array $context = []) $manager->flush(); } - public function process($data, array $identifiers = [], ?string $operationName = null, array $context = []) + public function process($data, array $uriVariables = [], ?string $operationName = null, array $context = []) { if (\array_key_exists('operation', $context) && $context['operation']->isDelete()) { return $this->remove($data); diff --git a/src/Doctrine/Odm/State/CollectionProvider.php b/src/Doctrine/Odm/State/CollectionProvider.php index d9bfcba613..f296e6b319 100644 --- a/src/Doctrine/Odm/State/CollectionProvider.php +++ b/src/Doctrine/Odm/State/CollectionProvider.php @@ -46,7 +46,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource $this->collectionExtensions = $collectionExtensions; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { /** @var DocumentManager $manager */ $manager = $this->managerRegistry->getManagerForClass($resourceClass); @@ -59,7 +59,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string $aggregationBuilder = $repository->createAggregationBuilder(); - $this->handleLinks($aggregationBuilder, $identifiers, $context, $resourceClass, $operationName); + $this->handleLinks($aggregationBuilder, $uriVariables, $context, $resourceClass, $operationName); foreach ($this->collectionExtensions as $extension) { $extension->applyToCollection($aggregationBuilder, $resourceClass, $operationName, $context); @@ -81,7 +81,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string return $aggregationBuilder->hydrate($resourceClass)->execute($executeOptions); } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { if (!$this->managerRegistry->getManagerForClass($resourceClass) instanceof DocumentManager) { return false; diff --git a/src/Doctrine/Odm/State/ItemProvider.php b/src/Doctrine/Odm/State/ItemProvider.php index 4c2eed5cff..e9f5f6d98f 100644 --- a/src/Doctrine/Odm/State/ItemProvider.php +++ b/src/Doctrine/Odm/State/ItemProvider.php @@ -48,14 +48,14 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource $this->itemExtensions = $itemExtensions; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { /** @var DocumentManager $manager */ $manager = $this->managerRegistry->getManagerForClass($resourceClass); $fetchData = $context['fetch_data'] ?? true; if (!$fetchData) { - return $manager->getReference($resourceClass, reset($identifiers)); + return $manager->getReference($resourceClass, reset($uriVariables)); } /** @var ObjectRepository $repository */ @@ -66,10 +66,10 @@ public function provide(string $resourceClass, array $identifiers = [], ?string $aggregationBuilder = $repository->createAggregationBuilder(); - $this->handleLinks($aggregationBuilder, $identifiers, $context, $resourceClass, $operationName); + $this->handleLinks($aggregationBuilder, $uriVariables, $context, $resourceClass, $operationName); foreach ($this->itemExtensions as $extension) { - $extension->applyToItem($aggregationBuilder, $resourceClass, $identifiers, $operationName, $context); + $extension->applyToItem($aggregationBuilder, $resourceClass, $uriVariables, $operationName, $context); if ($extension instanceof AggregationResultItemExtensionInterface && $extension->supportsResult($resourceClass, $operationName, $context)) { return $extension->getResult($aggregationBuilder, $resourceClass, $operationName, $context); @@ -87,7 +87,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string return $aggregationBuilder->hydrate($resourceClass)->execute($executeOptions)->current() ?: null; } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { if (!$this->managerRegistry->getManagerForClass($resourceClass) instanceof DocumentManager) { return false; diff --git a/src/Doctrine/Orm/State/CollectionProvider.php b/src/Doctrine/Orm/State/CollectionProvider.php index cd3de5d4e6..f625ff4c68 100644 --- a/src/Doctrine/Orm/State/CollectionProvider.php +++ b/src/Doctrine/Orm/State/CollectionProvider.php @@ -48,7 +48,7 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource $this->collectionExtensions = $collectionExtensions; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { /** @var EntityManagerInterface $manager */ $manager = $this->managerRegistry->getManagerForClass($resourceClass); @@ -62,7 +62,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string $queryBuilder = $repository->createQueryBuilder('o'); $queryNameGenerator = new QueryNameGenerator(); - $this->handleLinks($queryBuilder, $identifiers, $queryNameGenerator, $context, $resourceClass, $operationName); + $this->handleLinks($queryBuilder, $uriVariables, $queryNameGenerator, $context, $resourceClass, $operationName); foreach ($this->collectionExtensions as $extension) { $extension->applyToCollection($queryBuilder, $queryNameGenerator, $resourceClass, $operationName, $context); @@ -75,7 +75,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string return $queryBuilder->getQuery()->getResult(); } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { if (!$this->managerRegistry->getManagerForClass($resourceClass) instanceof EntityManagerInterface) { return false; diff --git a/src/Doctrine/Orm/State/ItemProvider.php b/src/Doctrine/Orm/State/ItemProvider.php index 3e61721932..9d4ec84dba 100644 --- a/src/Doctrine/Orm/State/ItemProvider.php +++ b/src/Doctrine/Orm/State/ItemProvider.php @@ -47,14 +47,14 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $resource $this->itemExtensions = $itemExtensions; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { /** @var EntityManagerInterface $manager */ $manager = $this->managerRegistry->getManagerForClass($resourceClass); $fetchData = $context['fetch_data'] ?? true; if (!$fetchData) { - return $manager->getReference($resourceClass, $identifiers); + return $manager->getReference($resourceClass, $uriVariables); } /** @var EntityRepository $repository */ @@ -66,10 +66,10 @@ public function provide(string $resourceClass, array $identifiers = [], ?string $queryBuilder = $repository->createQueryBuilder('o'); $queryNameGenerator = new QueryNameGenerator(); - $this->handleLinks($queryBuilder, $identifiers, $queryNameGenerator, $context, $resourceClass, $operationName); + $this->handleLinks($queryBuilder, $uriVariables, $queryNameGenerator, $context, $resourceClass, $operationName); foreach ($this->itemExtensions as $extension) { - $extension->applyToItem($queryBuilder, $queryNameGenerator, $resourceClass, $identifiers, $operationName, $context); + $extension->applyToItem($queryBuilder, $queryNameGenerator, $resourceClass, $uriVariables, $operationName, $context); if ($extension instanceof QueryResultItemExtensionInterface && $extension->supportsResult($resourceClass, $operationName, $context)) { return $extension->getResult($queryBuilder, $resourceClass, $operationName, $context); @@ -79,7 +79,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string return $queryBuilder->getQuery()->getOneOrNullResult(); } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { if (!$this->managerRegistry->getManagerForClass($resourceClass) instanceof EntityManagerInterface) { return false; diff --git a/src/Elasticsearch/State/CollectionProvider.php b/src/Elasticsearch/State/CollectionProvider.php index 916a78a13e..ab85db7b71 100644 --- a/src/Elasticsearch/State/CollectionProvider.php +++ b/src/Elasticsearch/State/CollectionProvider.php @@ -59,7 +59,7 @@ public function __construct(Client $client, DocumentMetadataFactoryInterface $do /** * {@inheritdoc} */ - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { try { $resourceMetadata = $this->resourceMetadataCollectionFactory->create($resourceClass); @@ -83,7 +83,7 @@ public function supports(string $resourceClass, array $identifiers = [], ?string /** * {@inheritdoc} */ - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { $documentMetadata = $this->documentMetadataFactory->create($resourceClass); $body = []; diff --git a/src/Elasticsearch/State/ItemProvider.php b/src/Elasticsearch/State/ItemProvider.php index 168c9e1b21..36b10300d8 100644 --- a/src/Elasticsearch/State/ItemProvider.php +++ b/src/Elasticsearch/State/ItemProvider.php @@ -50,7 +50,7 @@ public function __construct(Client $client, DocumentMetadataFactoryInterface $do /** * {@inheritdoc} */ - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { try { $resourceMetadata = $this->resourceMetadataCollectionFactory->create($resourceClass); @@ -74,7 +74,7 @@ public function supports(string $resourceClass, array $identifiers = [], ?string /** * {@inheritdoc} */ - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { $documentMetadata = $this->documentMetadataFactory->create($resourceClass); @@ -82,7 +82,7 @@ public function provide(string $resourceClass, array $identifiers = [], ?string $document = $this->client->get([ 'index' => $documentMetadata->getIndex(), 'type' => $documentMetadata->getType(), - 'id' => (string) reset($identifiers), + 'id' => (string) reset($uriVariables), ]); } catch (Missing404Exception $e) { return null; diff --git a/src/GraphQl/Resolver/Stage/ReadStage.php b/src/GraphQl/Resolver/Stage/ReadStage.php index 9ac1b03a3d..1fe1ce01d3 100644 --- a/src/GraphQl/Resolver/Stage/ReadStage.php +++ b/src/GraphQl/Resolver/Stage/ReadStage.php @@ -93,7 +93,7 @@ public function __invoke(?string $resourceClass, ?string $rootClass, string $ope return []; } - $identifiers = []; + $uriVariables = []; $normalizationContext['filters'] = $this->getNormalizedFilters($args); if (!$operation && $resourceClass) { @@ -106,11 +106,11 @@ public function __invoke(?string $resourceClass, ?string $rootClass, string $ope /** @var ResolveInfo $info */ $info = $context['info']; if (isset($source[$info->fieldName], $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY], $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY])) { - $identifiers = $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY]; + $uriVariables = $source[ItemNormalizer::ITEM_IDENTIFIERS_KEY]; $normalizationContext['linkClass'] = $source[ItemNormalizer::ITEM_RESOURCE_CLASS_KEY]; } - return $this->provider->provide($resourceClass, $identifiers, $operationName, $normalizationContext); + return $this->provider->provide($resourceClass, $uriVariables, $operationName, $normalizationContext); } /** diff --git a/src/HttpCache/EventListener/AddTagsListener.php b/src/HttpCache/EventListener/AddTagsListener.php index 4bba9d4cfd..413bb7fd7c 100644 --- a/src/HttpCache/EventListener/AddTagsListener.php +++ b/src/HttpCache/EventListener/AddTagsListener.php @@ -74,8 +74,8 @@ public function onKernelResponse(ResponseEvent $event): void $resources = $request->attributes->get('_resources'); if (isset($attributes['collection_operation_name']) || ($attributes['subresource_context']['collection'] ?? false) || ($operation && $operation->isCollection())) { // Allows to purge collections - $identifiers = $this->getOperationIdentifiers($operation, $request->attributes->all(), $attributes['resource_class']); - $iri = $this->iriConverter instanceof IriConverterInterface ? $this->iriConverter->getIriFromResourceClass($attributes['resource_class'], $attributes['operation_name'] ?? null, UrlGeneratorInterface::ABS_PATH, ['identifiers_values' => $identifiers]) : $this->iriConverter->getIriFromResourceClass($attributes['resource_class'], UrlGeneratorInterface::ABS_PATH); + $uriVariables = $this->getOperationUriVariables($operation, $request->attributes->all(), $attributes['resource_class']); + $iri = $this->iriConverter instanceof IriConverterInterface ? $this->iriConverter->getIriFromResourceClass($attributes['resource_class'], $attributes['operation_name'] ?? null, UrlGeneratorInterface::ABS_PATH, ['identifiers_values' => $uriVariables]) : $this->iriConverter->getIriFromResourceClass($attributes['resource_class'], UrlGeneratorInterface::ABS_PATH); $resources[$iri] = $iri; } diff --git a/src/Hydra/Serializer/ErrorNormalizer.php b/src/Hydra/Serializer/ErrorNormalizer.php index e4010f2434..d63b7f2b55 100644 --- a/src/Hydra/Serializer/ErrorNormalizer.php +++ b/src/Hydra/Serializer/ErrorNormalizer.php @@ -14,7 +14,7 @@ namespace ApiPlatform\Hydra\Serializer; use ApiPlatform\Api\UrlGeneratorInterface; -use ApiPlatform\Core\Problem\Serializer\ErrorNormalizerTrait; +use ApiPlatform\Problem\Serializer\ErrorNormalizerTrait; use Symfony\Component\Debug\Exception\FlattenException as LegacyFlattenException; use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface; diff --git a/src/JsonApi/Serializer/ErrorNormalizer.php b/src/JsonApi/Serializer/ErrorNormalizer.php index 13a0d27fc1..316a6b6262 100644 --- a/src/JsonApi/Serializer/ErrorNormalizer.php +++ b/src/JsonApi/Serializer/ErrorNormalizer.php @@ -13,7 +13,7 @@ namespace ApiPlatform\JsonApi\Serializer; -use ApiPlatform\Core\Problem\Serializer\ErrorNormalizerTrait; +use ApiPlatform\Problem\Serializer\ErrorNormalizerTrait; use Symfony\Component\Debug\Exception\FlattenException as LegacyFlattenException; use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface; diff --git a/src/Metadata/Property/Factory/LegacyPropertyMetadataFactory.php b/src/Metadata/Property/Factory/LegacyPropertyMetadataFactory.php index 84b530e52d..8bbbe0d60b 100644 --- a/src/Metadata/Property/Factory/LegacyPropertyMetadataFactory.php +++ b/src/Metadata/Property/Factory/LegacyPropertyMetadataFactory.php @@ -13,9 +13,9 @@ namespace ApiPlatform\Metadata\Property\Factory; -use ApiPlatform\Core\Exception\ResourceClassNotFoundException; use ApiPlatform\Core\Metadata\Property\Factory\PropertyMetadataFactoryInterface as LegacyPropertyMetadataFactoryInterface; use ApiPlatform\Exception\PropertyNotFoundException; +use ApiPlatform\Exception\ResourceClassNotFoundException; use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Property\DeprecationMetadataTrait; @@ -48,7 +48,7 @@ public function create(string $resourceClass, string $property, array $options = } try { - $legacyPropertyMetadata = $this->legacyPropertyMetadataFactory->create($resourceClass, $property, $options); + $legacyPropertyMetadata = $this->legacyPropertyMetadataFactory->create($resourceClass, $property, ['deprecate' => false] + $options); } catch (PropertyNotFoundException|ResourceClassNotFoundException $propertyNotFoundException) { return $propertyMetadata; } diff --git a/src/Metadata/Resource/Factory/FiltersResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/FiltersResourceMetadataCollectionFactory.php index d123ec58fd..55c17ffb23 100644 --- a/src/Metadata/Resource/Factory/FiltersResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/FiltersResourceMetadataCollectionFactory.php @@ -35,7 +35,6 @@ public function __construct(ResourceMetadataCollectionFactoryInterface $decorate { $this->decorated = $decorated; if ($reader) { - trigger_deprecation('api-platform/core', '2.7', 'Use php attributes instead of doctrine annotations.'); $this->reader = $reader; } } @@ -59,6 +58,10 @@ public function create(string $resourceClass): ResourceMetadataCollection $filters = array_keys($this->readFilterAnnotations($reflectionClass, $this->reader)); + if (\count($filters)) { + trigger_deprecation('api-platform/core', '2.7', 'Use php attributes instead of doctrine annotations to declare filters.'); + } + foreach ($resourceMetadataCollection as $i => $resource) { foreach ($operations = $resource->getOperations() as $operationName => $operation) { $operations->add($operationName, $operation->withFilters(array_unique(array_merge($resource->getFilters() ?? [], $operation->getFilters() ?? [], $filters)))); diff --git a/src/State/ChainProcessor.php b/src/State/ChainProcessor.php index f2b93b8fde..da28d790dd 100644 --- a/src/State/ChainProcessor.php +++ b/src/State/ChainProcessor.php @@ -35,10 +35,10 @@ public function __construct(iterable $processors) $this->processors = $processors; } - public function supports($data, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports($data, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { foreach ($this->processors as $processor) { - if ($supports = $processor->supports($data, $identifiers, $operationName, $context)) { + if ($supports = $processor->supports($data, $uriVariables, $operationName, $context)) { return $supports; } } @@ -46,11 +46,11 @@ public function supports($data, array $identifiers = [], ?string $operationName return false; } - public function process($data, array $identifiers = [], ?string $operationName = null, array $context = []) + public function process($data, array $uriVariables = [], ?string $operationName = null, array $context = []) { foreach ($this->processors as $processor) { - if ($processor->supports($data, $identifiers, $operationName, $context)) { - return $processor->process($data, $identifiers, $operationName, $context); + if ($processor->supports($data, $uriVariables, $operationName, $context)) { + return $processor->process($data, $uriVariables, $operationName, $context); } } diff --git a/src/State/ChainProvider.php b/src/State/ChainProvider.php index 66f674d79f..e803ec2cb4 100644 --- a/src/State/ChainProvider.php +++ b/src/State/ChainProvider.php @@ -35,21 +35,21 @@ public function __construct(iterable $providers) $this->providers = $providers; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { foreach ($this->providers as $provider) { - if ($provider->supports($resourceClass, $identifiers, $operationName, $context)) { - return $provider->provide($resourceClass, $identifiers, $operationName, $context); + if ($provider->supports($resourceClass, $uriVariables, $operationName, $context)) { + return $provider->provide($resourceClass, $uriVariables, $operationName, $context); } } - return \count($identifiers) ? null : []; + return \count($uriVariables) ? null : []; } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { foreach ($this->providers as $provider) { - if ($provider->supports($resourceClass, $identifiers, $operationName, $context)) { + if ($provider->supports($resourceClass, $uriVariables, $operationName, $context)) { return true; } } diff --git a/src/State/ProcessorInterface.php b/src/State/ProcessorInterface.php index 7816d6cd64..7195442d4a 100644 --- a/src/State/ProcessorInterface.php +++ b/src/State/ProcessorInterface.php @@ -25,12 +25,12 @@ interface ProcessorInterface * * @param mixed $data */ - public function supports($data, array $identifiers = [], ?string $operationName = null, array $context = []): bool; + public function supports($data, array $uriVariables = [], ?string $operationName = null, array $context = []): bool; /** * Handle the state. * * @param mixed $data */ - public function process($data, array $identifiers = [], ?string $operationName = null, array $context = []); + public function process($data, array $uriVariables = [], ?string $operationName = null, array $context = []); } diff --git a/src/State/ProviderInterface.php b/src/State/ProviderInterface.php index 320a20f8bf..3f44de9dd7 100644 --- a/src/State/ProviderInterface.php +++ b/src/State/ProviderInterface.php @@ -26,10 +26,10 @@ interface ProviderInterface * * @return object|array|null */ - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []); + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []); /** * Whether this state provider supports the class/identifier tuple. */ - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool; + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool; } diff --git a/src/State/UriVariablesResolverTrait.php b/src/State/UriVariablesResolverTrait.php index 5687d6d725..d2b0efc3dd 100644 --- a/src/State/UriVariablesResolverTrait.php +++ b/src/State/UriVariablesResolverTrait.php @@ -33,7 +33,7 @@ trait UriVariablesResolverTrait * * @param Operation|null $operation */ - private function getOperationIdentifiers($operation, array $parameters, string $resourceClass): array + private function getOperationUriVariables($operation, array $parameters, string $resourceClass): array { $identifiers = []; diff --git a/src/Symfony/Bundle/Processor/TraceableChainProcessor.php b/src/Symfony/Bundle/Processor/TraceableChainProcessor.php index f784c06bd1..3a313ffe94 100644 --- a/src/Symfony/Bundle/Processor/TraceableChainProcessor.php +++ b/src/Symfony/Bundle/Processor/TraceableChainProcessor.php @@ -54,15 +54,15 @@ public function resumable(?string $operationName = null, array $context = []): b return false; } - public function process($data, array $identifiers = [], ?string $operationName = null, array $context = []) + public function process($data, array $uriVariables = [], ?string $operationName = null, array $context = []) { $this->traceProcessors($data, $context); - return $this->decorated->process($data, $identifiers, $operationName, $context); + return $this->decorated->process($data, $uriVariables, $operationName, $context); } - public function supports($data, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports($data, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { - return $this->decorated->supports($data, $identifiers, $operationName, $context); + return $this->decorated->supports($data, $uriVariables, $operationName, $context); } } diff --git a/src/Symfony/Bundle/Provider/TraceableChainProvider.php b/src/Symfony/Bundle/Provider/TraceableChainProvider.php index e8c9af1339..dc5b12dc51 100644 --- a/src/Symfony/Bundle/Provider/TraceableChainProvider.php +++ b/src/Symfony/Bundle/Provider/TraceableChainProvider.php @@ -41,10 +41,10 @@ public function getContext() return $this->context; } - private function traceProviders(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + private function traceProviders(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { foreach ($this->providers as $provider) { - $this->providersResponse[\get_class($provider)] = $provider->supports($resourceClass, $identifiers, $operationName, $context); + $this->providersResponse[\get_class($provider)] = $provider->supports($resourceClass, $uriVariables, $operationName, $context); } } @@ -53,16 +53,16 @@ private function traceContext(array $context) $this->context = $context; } - public function provide(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []) + public function provide(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []) { - $this->traceProviders($resourceClass, $identifiers, $operationName, $context); + $this->traceProviders($resourceClass, $uriVariables, $operationName, $context); $this->traceContext($context); - return $this->decorated->provide($resourceClass, $identifiers, $operationName, $context); + return $this->decorated->provide($resourceClass, $uriVariables, $operationName, $context); } - public function supports(string $resourceClass, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports(string $resourceClass, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { - return $this->decorated->supports($resourceClass, $identifiers, $operationName, $context); + return $this->decorated->supports($resourceClass, $uriVariables, $operationName, $context); } } diff --git a/src/Symfony/EventListener/ReadListener.php b/src/Symfony/EventListener/ReadListener.php index 7261de5c45..4b91515fe6 100644 --- a/src/Symfony/EventListener/ReadListener.php +++ b/src/Symfony/EventListener/ReadListener.php @@ -89,8 +89,8 @@ public function onKernelRequest(RequestEvent $event): void $parameters = $request->attributes->all(); $resourceClass = $operation->getClass() ?? $attributes['resource_class']; try { - $identifiers = $this->getOperationIdentifiers($operation, $parameters, $resourceClass); - $data = $this->provider->provide($resourceClass, $identifiers, $operation->getName(), $context); + $uriVariables = $this->getOperationUriVariables($operation, $parameters, $resourceClass); + $data = $this->provider->provide($resourceClass, $uriVariables, $operation->getName(), $context); } catch (InvalidIdentifierException $e) { throw new NotFoundHttpException('Invalid identifier value or configuration.', $e); } catch (InvalidUriVariableException $e) { diff --git a/src/Symfony/EventListener/WriteListener.php b/src/Symfony/EventListener/WriteListener.php index 785560baba..4cd4f76f45 100644 --- a/src/Symfony/EventListener/WriteListener.php +++ b/src/Symfony/EventListener/WriteListener.php @@ -77,12 +77,12 @@ public function onKernelView(ViewEvent $event): void $context = ['operation' => $operation, 'resource_class' => $attributes['resource_class']]; try { - $identifiers = $this->getOperationIdentifiers($operation, $request->attributes->all(), $attributes['resource_class']); + $uriVariables = $this->getOperationUriVariables($operation, $request->attributes->all(), $attributes['resource_class']); } catch (InvalidIdentifierException $e) { throw new NotFoundHttpException('Invalid identifier value or configuration.', $e); } - if (!$this->processor->supports($controllerResult, $identifiers, $operation->getName(), $context)) { + if (!$this->processor->supports($controllerResult, $uriVariables, $operation->getName(), $context)) { return; } @@ -90,7 +90,7 @@ public function onKernelView(ViewEvent $event): void case 'PUT': case 'PATCH': case 'POST': - $persistResult = $this->processor->process($controllerResult, $identifiers, $operation->getName(), $context); + $persistResult = $this->processor->process($controllerResult, $uriVariables, $operation->getName(), $context); if ($persistResult) { $controllerResult = $persistResult; @@ -113,7 +113,7 @@ public function onKernelView(ViewEvent $event): void break; case 'DELETE': - $this->processor->process($controllerResult, $identifiers, $operation->getName(), $context); + $this->processor->process($controllerResult, $uriVariables, $operation->getName(), $context); $event->setControllerResult(null); break; } diff --git a/src/Symfony/Messenger/Processor.php b/src/Symfony/Messenger/Processor.php index e39bac79d6..c4feb7accd 100644 --- a/src/Symfony/Messenger/Processor.php +++ b/src/Symfony/Messenger/Processor.php @@ -67,7 +67,7 @@ private function remove($data, array $context = []) ); } - public function process($data, array $identifiers = [], ?string $operationName = null, array $context = []) + public function process($data, array $uriVariables = [], ?string $operationName = null, array $context = []) { if (\array_key_exists('operation', $context) && $context['operation']->isDelete()) { return $this->remove($data); @@ -76,7 +76,7 @@ public function process($data, array $identifiers = [], ?string $operationName = return $this->persist($data); } - public function supports($data, array $identifiers = [], ?string $operationName = null, array $context = []): bool + public function supports($data, array $uriVariables = [], ?string $operationName = null, array $context = []): bool { try { if (isset($context['operation'])) { diff --git a/src/Symfony/Routing/IriConverter.php b/src/Symfony/Routing/IriConverter.php index 8f081b4325..6d0e1b0be4 100644 --- a/src/Symfony/Routing/IriConverter.php +++ b/src/Symfony/Routing/IriConverter.php @@ -88,12 +88,12 @@ public function getItemFromIri(string $iri, array $context = []) $attributes = AttributesExtractor::extractAttributes($parameters); try { - $identifiers = $this->getOperationIdentifiers($operation, $parameters, $attributes['resource_class']); + $uriVariables = $this->getOperationUriVariables($operation, $parameters, $attributes['resource_class']); } catch (InvalidIdentifierException $e) { throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); } - if ($item = $this->stateProvider->provide($attributes['resource_class'], $identifiers, $attributes['operation_name'], $context)) { + if ($item = $this->stateProvider->provide($attributes['resource_class'], $uriVariables, $attributes['operation_name'], $context)) { return $item; } diff --git a/src/deprecated_interfaces.php b/src/deprecated_interfaces.php index bcb4de3d55..d8aa1e5ae8 100644 --- a/src/deprecated_interfaces.php +++ b/src/deprecated_interfaces.php @@ -12,7 +12,6 @@ declare(strict_types=1); return [ - ApiPlatform\Core\Metadata\Property\Factory\PropertyMetadataFactoryInterface::class => ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface::class, ApiPlatform\Core\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface::class => ApiPlatform\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface::class, ApiPlatform\Core\Metadata\Resource\ResourceNameCollectionFactoryInterface::class => ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface::class, ApiPlatform\Core\Metadata\Extractor\ExtractorInterface::class => ApiPlatform\Metadata\Extractor\ResourceExtractorInterface::class,