diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 490f91a8104..afae1b511d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2008,7 +2008,7 @@ jobs: fail-fast: false timeout-minutes: 20 env: - SYMFONY_DEPRECATIONS_HELPER: max[total]=5 # 5 deprecation notices from FOSUserBundle + SYMFONY_DEPRECATIONS_HELPER: max[total]=8 # 5 deprecation notices from FOSUserBundle steps: - name: Checkout uses: actions/checkout@v1 diff --git a/src/Bridge/Doctrine/MongoDbOdm/Extension/OrderExtension.php b/src/Bridge/Doctrine/MongoDbOdm/Extension/OrderExtension.php index d335235aff4..68302cf142d 100644 --- a/src/Bridge/Doctrine/MongoDbOdm/Extension/OrderExtension.php +++ b/src/Bridge/Doctrine/MongoDbOdm/Extension/OrderExtension.php @@ -54,7 +54,7 @@ public function applyToCollection(Builder $aggregationBuilder, string $resourceC $identifiers = $classMetaData->getIdentifier(); if (null !== $this->resourceMetadataFactory) { $defaultOrder = $this->resourceMetadataFactory->create($resourceClass)->getAttribute('order'); - if (null !== $defaultOrder) { + if (\is_array($defaultOrder)) { foreach ($defaultOrder as $field => $order) { if (\is_int($field)) { // Default direction diff --git a/src/Bridge/Doctrine/Orm/Extension/OrderExtension.php b/src/Bridge/Doctrine/Orm/Extension/OrderExtension.php index 1d2b1e3f469..0cc5a94d125 100644 --- a/src/Bridge/Doctrine/Orm/Extension/OrderExtension.php +++ b/src/Bridge/Doctrine/Orm/Extension/OrderExtension.php @@ -52,7 +52,7 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator $identifiers = $classMetaData->getIdentifier(); if (null !== $this->resourceMetadataFactory) { $defaultOrder = $this->resourceMetadataFactory->create($resourceClass)->getAttribute('order'); - if (null !== $defaultOrder) { + if (\is_array($defaultOrder)) { foreach ($defaultOrder as $field => $order) { if (\is_int($field)) { // Default direction diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index d7c7d5d53fd..6fc9f146da4 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -167,26 +167,26 @@ private function registerCommonConfiguration(ContainerBuilder $container, array $container->setParameter('api_platform.eager_loading.fetch_partial', $config['eager_loading']['fetch_partial']); $container->setParameter('api_platform.eager_loading.force_eager', $config['eager_loading']['force_eager']); $container->setParameter('api_platform.collection.exists_parameter_name', $config['collection']['exists_parameter_name']); - $container->setParameter('api_platform.collection.order', $config['collection']['order']); + $container->setParameter('api_platform.collection.order', $config['defaults']['order'] ?? $config['collection']['order']); $container->setParameter('api_platform.collection.order_parameter_name', $config['collection']['order_parameter_name']); - $container->setParameter('api_platform.collection.pagination.enabled', $this->isConfigEnabled($container, $config['collection']['pagination'])); - $container->setParameter('api_platform.collection.pagination.partial', $config['collection']['pagination']['partial']); - $container->setParameter('api_platform.collection.pagination.client_enabled', $config['collection']['pagination']['client_enabled']); - $container->setParameter('api_platform.collection.pagination.client_items_per_page', $config['collection']['pagination']['client_items_per_page']); - $container->setParameter('api_platform.collection.pagination.client_partial', $config['collection']['pagination']['client_partial']); - $container->setParameter('api_platform.collection.pagination.items_per_page', $config['collection']['pagination']['items_per_page']); - $container->setParameter('api_platform.collection.pagination.maximum_items_per_page', $config['collection']['pagination']['maximum_items_per_page']); - $container->setParameter('api_platform.collection.pagination.page_parameter_name', $config['collection']['pagination']['page_parameter_name']); - $container->setParameter('api_platform.collection.pagination.enabled_parameter_name', $config['collection']['pagination']['enabled_parameter_name']); - $container->setParameter('api_platform.collection.pagination.items_per_page_parameter_name', $config['collection']['pagination']['items_per_page_parameter_name']); - $container->setParameter('api_platform.collection.pagination.partial_parameter_name', $config['collection']['pagination']['partial_parameter_name']); - $container->setParameter('api_platform.collection.pagination', $config['collection']['pagination']); - $container->setParameter('api_platform.http_cache.etag', $config['http_cache']['etag']); - $container->setParameter('api_platform.http_cache.max_age', $config['http_cache']['max_age']); - $container->setParameter('api_platform.http_cache.shared_max_age', $config['http_cache']['shared_max_age']); - $container->setParameter('api_platform.http_cache.vary', $config['http_cache']['vary']); - $container->setParameter('api_platform.http_cache.public', $config['http_cache']['public']); - $container->setParameter('api_platform.http_cache.invalidation.max_header_length', $config['http_cache']['invalidation']['max_header_length']); + $container->setParameter('api_platform.collection.pagination.enabled', $this->isConfigEnabled($container, $config['defaults']['pagination_enabled'] ?? $config['collection']['pagination'])); + $container->setParameter('api_platform.collection.pagination.partial', $config['defaults']['pagination_partial'] ?? $config['collection']['pagination']['partial']); + $container->setParameter('api_platform.collection.pagination.client_enabled', $config['defaults']['pagination_client_enabled'] ?? $config['collection']['pagination']['client_enabled']); + $container->setParameter('api_platform.collection.pagination.client_items_per_page', $config['defaults']['pagination_client_items_per_page'] ?? $config['collection']['pagination']['client_items_per_page']); + $container->setParameter('api_platform.collection.pagination.client_partial', $config['defaults']['pagination_client_partial'] ?? $config['collection']['pagination']['client_partial']); + $container->setParameter('api_platform.collection.pagination.items_per_page', $config['defaults']['pagination_items_per_page'] ?? $config['collection']['pagination']['items_per_page']); + $container->setParameter('api_platform.collection.pagination.maximum_items_per_page', $config['defaults']['pagination_maximum_items_per_page'] ?? $config['collection']['pagination']['maximum_items_per_page']); + $container->setParameter('api_platform.collection.pagination.page_parameter_name', $config['defaults']['pagination_page_parameter_name'] ?? $config['collection']['pagination']['page_parameter_name']); + $container->setParameter('api_platform.collection.pagination.enabled_parameter_name', $config['defaults']['pagination_enabled_parameter_name'] ?? $config['collection']['pagination']['enabled_parameter_name']); + $container->setParameter('api_platform.collection.pagination.items_per_page_parameter_name', $config['defaults']['pagination_items_per_page_parameter_name'] ?? $config['collection']['pagination']['items_per_page_parameter_name']); + $container->setParameter('api_platform.collection.pagination.partial_parameter_name', $config['defaults']['pagination_partial_parameter_name'] ?? $config['collection']['pagination']['partial_parameter_name']); + $container->setParameter('api_platform.collection.pagination', $this->getPaginationDefaults($config['defaults'], $config['collection']['pagination'])); + $container->setParameter('api_platform.http_cache.etag', $config['defaults']['cache_headers']['etag'] ?? $config['http_cache']['etag']); + $container->setParameter('api_platform.http_cache.max_age', $config['defaults']['cache_headers']['max_age'] ?? $config['http_cache']['max_age']); + $container->setParameter('api_platform.http_cache.shared_max_age', $config['defaults']['cache_headers']['shared_max_age'] ?? $config['http_cache']['shared_max_age']); + $container->setParameter('api_platform.http_cache.vary', $config['defaults']['cache_headers']['vary'] ?? $config['http_cache']['vary']); + $container->setParameter('api_platform.http_cache.public', $config['defaults']['cache_headers']['public'] ?? $config['http_cache']['public']); + $container->setParameter('api_platform.http_cache.invalidation.max_header_length', $config['defaults']['cache_headers']['invalidation']['max_header_length'] ?? $config['http_cache']['invalidation']['max_header_length']); $container->setAlias('api_platform.operation_path_resolver.default', $config['default_operation_path_resolver']); $container->setAlias('api_platform.path_segment_name_generator', $config['path_segment_name_generator']); @@ -197,6 +197,24 @@ private function registerCommonConfiguration(ContainerBuilder $container, array $container->setParameter('api_platform.defaults', $this->normalizeDefaults($config['defaults'] ?? [])); } + /** + * This method will be removed in 3.0 when "defaults" will be the regular configuration path for the pagination. + */ + private function getPaginationDefaults(array $defaults, array $collectionPaginationConfiguration): array + { + $paginationOptions = []; + + foreach ($defaults as $key => $value) { + if (0 !== strpos($key, 'pagination_')) { + continue; + } + + $paginationOptions[str_replace('pagination_', '', $key)] = $value; + } + + return array_merge($collectionPaginationConfiguration, $paginationOptions); + } + private function normalizeDefaults(array $defaults): array { $normalizedDefaults = ['attributes' => []]; diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php index 237318caa33..1373719287a 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php @@ -366,7 +366,6 @@ private function addHttpCacheSection(ArrayNodeDefinition $rootNode): void ->end() ->booleanNode('public')->defaultNull()->info('To make all responses public by default.')->end() ->arrayNode('invalidation') - ->setDeprecated('The use of the `http_cache.invalidation` has been deprecated in 2.6 and will be removed in 3.0. Use `defaults.cache_headers.invalidation` instead.') ->info('Enable the tags-based cache invalidation system.') ->canBeEnabled() ->children() diff --git a/tests/Fixtures/app/config/config_common.yml b/tests/Fixtures/app/config/config_common.yml index 94c452a69bf..caf23a48d8c 100644 --- a/tests/Fixtures/app/config/config_common.yml +++ b/tests/Fixtures/app/config/config_common.yml @@ -58,14 +58,6 @@ api_platform: nesting_separator: __ name_converter: 'app.name_converter' enable_fos_user: true - collection: - order_parameter_name: 'order' - order: 'ASC' - pagination: - client_enabled: true - client_items_per_page: true - client_partial: true - items_per_page: 3 exception_to_status: Symfony\Component\Serializer\Exception\ExceptionInterface: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST ApiPlatform\Core\Exception\InvalidArgumentException: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST @@ -73,10 +65,17 @@ api_platform: http_cache: invalidation: enabled: true - max_age: 60 - shared_max_age: 3600 - vary: ['Accept', 'Cookie'] - public: true + defaults: + pagination_client_enabled: true + pagination_client_items_per_page: true + pagination_client_partial: true + pagination_items_per_page: 3 + order: 'ASC' + cache_headers: + max_age: 60 + shared_max_age: 3600 + vary: ['Accept', 'Cookie'] + public: true parameters: container.autowiring.strict_mode: true @@ -144,11 +143,11 @@ services: ApiPlatform\Core\Tests\Fixtures\TestBundle\Filter\RequiredAllowEmptyFilter: arguments: [ '@doctrine' ] tags: [ 'api_platform.filter' ] - + ApiPlatform\Core\Tests\Fixtures\TestBundle\Filter\BoundsFilter: arguments: [ '@doctrine' ] tags: [ 'api_platform.filter' ] - + ApiPlatform\Core\Tests\Fixtures\TestBundle\Filter\LengthFilter: arguments: [ '@doctrine' ] tags: [ 'api_platform.filter' ] @@ -156,7 +155,7 @@ services: ApiPlatform\Core\Tests\Fixtures\TestBundle\Filter\PatternFilter: arguments: [ '@doctrine' ] tags: [ 'api_platform.filter' ] - + ApiPlatform\Core\Tests\Fixtures\TestBundle\Controller\: resource: '../../TestBundle/Controller' tags: ['controller.service_arguments'] diff --git a/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php b/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php index 744e3e66053..c53dfa048c6 100644 --- a/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php +++ b/tests/Metadata/Resource/Factory/AnnotationResourceMetadataFactoryTest.php @@ -62,6 +62,7 @@ public function testCreateWithDefaults() $annotation = new ApiResource([ 'itemOperations' => ['get', 'delete'], 'attributes' => [ + 'pagination_client_enabled' => true, 'pagination_maximum_items_per_page' => 10, ], ]); @@ -74,6 +75,7 @@ public function testCreateWithDefaults() $this->assertEquals('CHANGEME!', $metadata->getDescription()); $this->assertEquals(['get'], $metadata->getCollectionOperations()); $this->assertEquals(['get', 'delete'], $metadata->getItemOperations()); + $this->assertTrue($metadata->getAttribute('pagination_client_enabled')); $this->assertEquals(4, $metadata->getAttribute('pagination_items_per_page')); $this->assertEquals(10, $metadata->getAttribute('pagination_maximum_items_per_page')); }