Skip to content

Commit c24a07a

Browse files
authored
Merge pull request #2453 from meyerbaptiste/enhance_filter_annotation
Enhance the filter annotation
2 parents 92d45aa + 48e2be0 commit c24a07a

File tree

6 files changed

+50
-4
lines changed

6 files changed

+50
-4
lines changed

src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/AnnotationFilterPass.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Core\Util\AnnotationFilterExtractorTrait;
1717
use ApiPlatform\Core\Util\ReflectionClassRecursiveIterator;
1818
use Doctrine\Common\Annotations\Reader;
19+
use Symfony\Component\DependencyInjection\ChildDefinition;
1920
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
2021
use Symfony\Component\DependencyInjection\ContainerBuilder;
2122
use Symfony\Component\DependencyInjection\Definition;
@@ -56,8 +57,13 @@ private function createFilterDefinitions(\ReflectionClass $reflectionClass, Read
5657
continue;
5758
}
5859

59-
$definition = new Definition();
60-
$definition->setClass($filterClass);
60+
if ($container->has($filterClass) && $container->findDefinition($filterClass)->isAbstract()) {
61+
$definition = new ChildDefinition($filterClass);
62+
} else {
63+
$definition = new Definition();
64+
$definition->setClass($filterClass);
65+
}
66+
6167
$definition->addTag(self::TAG_FILTER_NAME);
6268
$definition->setAutowired(true);
6369

src/Bridge/Symfony/Bundle/Resources/config/api.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@
8383
</service>
8484

8585
<service id="api_platform.serializer.property_filter" class="ApiPlatform\Core\Serializer\Filter\PropertyFilter" public="false" abstract="true" />
86+
<service id="ApiPlatform\Core\Serializer\Filter\PropertyFilter" alias="api_platform.serializer.property_filter" />
8687

8788
<service id="api_platform.serializer.group_filter" class="ApiPlatform\Core\Serializer\Filter\GroupFilter" public="false" abstract="true" />
89+
<service id="ApiPlatform\Core\Serializer\Filter\GroupFilter" alias="api_platform.serializer.group_filter" />
8890

8991
<service id="api_platform.serializer.normalizer.item" class="ApiPlatform\Core\Serializer\ItemNormalizer" public="false">
9092
<argument type="service" id="api_platform.metadata.property.name_collection_factory" />

src/Bridge/Symfony/Bundle/Resources/config/doctrine_orm.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,43 +56,50 @@
5656
<argument type="service" id="api_platform.property_accessor" />
5757
<argument type="service" id="logger" on-invalid="ignore" />
5858
</service>
59+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter" alias="api_platform.doctrine.orm.search_filter" />
5960

6061
<service id="api_platform.doctrine.orm.order_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter" public="false" abstract="true">
6162
<argument type="service" id="doctrine" />
6263
<argument>null</argument>
6364
<argument>%api_platform.collection.order_parameter_name%</argument>
6465
<argument type="service" id="logger" on-invalid="ignore" />
6566
</service>
67+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter" alias="api_platform.doctrine.orm.order_filter" />
6668

6769
<service id="api_platform.doctrine.orm.range_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter" public="false" abstract="true">
6870
<argument type="service" id="doctrine" />
6971
<argument>null</argument>
7072
<argument type="service" id="logger" on-invalid="ignore" />
7173
</service>
74+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter" alias="api_platform.doctrine.orm.range_filter" />
7275

7376
<service id="api_platform.doctrine.orm.date_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter" public="false" abstract="true">
7477
<argument type="service" id="doctrine" />
7578
<argument>null</argument>
7679
<argument type="service" id="logger" on-invalid="ignore" />
7780
</service>
81+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter" alias="api_platform.doctrine.orm.date_filter" />
7882

7983
<service id="api_platform.doctrine.orm.boolean_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter" public="false" abstract="true">
8084
<argument type="service" id="doctrine" />
8185
<argument>null</argument>
8286
<argument type="service" id="logger" on-invalid="ignore" />
8387
</service>
88+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter" alias="api_platform.doctrine.orm.boolean_filter" />
8489

8590
<service id="api_platform.doctrine.orm.numeric_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter" public="false" abstract="true">
8691
<argument type="service" id="doctrine" />
8792
<argument>null</argument>
8893
<argument type="service" id="logger" on-invalid="ignore" />
8994
</service>
95+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter" alias="api_platform.doctrine.orm.numeric_filter" />
9096

9197
<service id="api_platform.doctrine.orm.exists_filter" class="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter" public="false" abstract="true">
9298
<argument type="service" id="doctrine" />
9399
<argument>null</argument>
94100
<argument type="service" id="logger" on-invalid="ignore" />
95101
</service>
102+
<service id="ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter" alias="api_platform.doctrine.orm.exists_filter" />
96103

97104
<!-- Metadata loader -->
98105

src/Bridge/Symfony/Bundle/Resources/config/elasticsearch.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
<argument type="service" id="api_platform.property_accessor" />
120120
<argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
121121
</service>
122+
<service id="ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\TermFilter" alias="api_platform.elasticsearch.term_filter" />
122123

123124
<service id="api_platform.elasticsearch.order_filter" class="ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\OrderFilter" public="false" abstract="true">
124125
<argument type="service" id="api_platform.metadata.property.name_collection_factory" />
@@ -127,6 +128,7 @@
127128
<argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
128129
<argument>%api_platform.collection.order_parameter_name%</argument>
129130
</service>
131+
<service id="ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\OrderFilter" alias="api_platform.elasticsearch.order_filter" />
130132
</services>
131133

132134
</container>

tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,17 @@
2424
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\PaginationExtension;
2525
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
2626
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
27+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter;
28+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
29+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter;
30+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter;
31+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
32+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter;
33+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
2734
use ApiPlatform\Core\Bridge\Elasticsearch\Api\IdentifierExtractorInterface;
2835
use ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Extension\FullBodySearchCollectionExtensionInterface;
36+
use ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\OrderFilter as ElasticsearchOrderFilter;
37+
use ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\TermFilter;
2938
use ApiPlatform\Core\Bridge\Elasticsearch\Metadata\Document\Factory\DocumentMetadataFactoryInterface;
3039
use ApiPlatform\Core\Bridge\Symfony\Bundle\DependencyInjection\ApiPlatformExtension;
3140
use ApiPlatform\Core\DataPersister\DataPersisterInterface;
@@ -40,6 +49,8 @@
4049
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
4150
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
4251
use ApiPlatform\Core\Security\ResourceAccessCheckerInterface;
52+
use ApiPlatform\Core\Serializer\Filter\GroupFilter;
53+
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
4354
use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
4455
use ApiPlatform\Core\Tests\Fixtures\TestBundle\TestBundle;
4556
use ApiPlatform\Core\Validator\ValidatorInterface;
@@ -467,6 +478,8 @@ public function testEnableElasticsearch()
467478
$containerBuilderProphecy->setAlias('api_platform.elasticsearch.metadata.document.metadata_factory', 'api_platform.elasticsearch.metadata.document.metadata_factory.configured')->shouldBeCalled();
468479
$containerBuilderProphecy->setAlias(DocumentMetadataFactoryInterface::class, 'api_platform.elasticsearch.metadata.document.metadata_factory')->shouldBeCalled();
469480
$containerBuilderProphecy->setAlias(IdentifierExtractorInterface::class, 'api_platform.elasticsearch.identifier_extractor')->shouldBeCalled();
481+
$containerBuilderProphecy->setAlias(TermFilter::class, 'api_platform.elasticsearch.term_filter')->shouldBeCalled();
482+
$containerBuilderProphecy->setAlias(ElasticsearchOrderFilter::class, 'api_platform.elasticsearch.order_filter')->shouldBeCalled();
470483
$containerBuilderProphecy->registerForAutoconfiguration(FullBodySearchCollectionExtensionInterface::class)->willReturn($childDefinitionProphecy)->shouldBeCalled();
471484
$containerBuilderProphecy->setParameter('api_platform.elasticsearch.host', 'http://elasticsearch:9200')->shouldBeCalled();
472485
$containerBuilderProphecy->setParameter('api_platform.elasticsearch.mapping', [])->shouldBeCalled();
@@ -702,6 +715,8 @@ private function getPartialContainerBuilderProphecy($test = false)
702715
PropertyMetadataFactoryInterface::class => 'api_platform.metadata.property.metadata_factory',
703716
ValidatorInterface::class => 'api_platform.validator',
704717
ResourceClassResolverInterface::class => 'api_platform.resource_class_resolver',
718+
PropertyFilter::class => 'api_platform.serializer.property_filter',
719+
GroupFilter::class => 'api_platform.serializer.group_filter',
705720
];
706721

707722
foreach ($aliases as $alias => $service) {
@@ -860,6 +875,13 @@ private function getBaseContainerBuilderProphecy()
860875
PaginationExtension::class => 'api_platform.doctrine.orm.query_extension.pagination',
861876
OrderExtension::class => 'api_platform.doctrine.orm.query_extension.order',
862877
ValidatorInterface::class => 'api_platform.validator',
878+
SearchFilter::class => 'api_platform.doctrine.orm.search_filter',
879+
OrderFilter::class => 'api_platform.doctrine.orm.order_filter',
880+
RangeFilter::class => 'api_platform.doctrine.orm.range_filter',
881+
DateFilter::class => 'api_platform.doctrine.orm.date_filter',
882+
BooleanFilter::class => 'api_platform.doctrine.orm.boolean_filter',
883+
NumericFilter::class => 'api_platform.doctrine.orm.numeric_filter',
884+
ExistsFilter::class => 'api_platform.doctrine.orm.exists_filter',
863885
];
864886

865887
foreach ($aliases as $alias => $service) {

tests/Bridge/Symfony/Bundle/DependencyInjection/Compiler/AnnotationFilterPassTest.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Doctrine\Common\Annotations\Reader;
2727
use PHPUnit\Framework\TestCase;
2828
use Prophecy\Argument;
29+
use Symfony\Component\DependencyInjection\ChildDefinition;
2930
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
3031
use Symfony\Component\DependencyInjection\ContainerBuilder;
3132
use Symfony\Component\DependencyInjection\Definition;
@@ -71,6 +72,12 @@ public function testProcess()
7172
$containerBuilderProphecy->hasDefinition('annotated_api_platform_core_tests_fixtures_test_bundle_entity_dummy_api_platform_core_serializer_filter_group_filter')->shouldBeCalled()->willReturn(false);
7273
$containerBuilderProphecy->hasDefinition('annotated_api_platform_core_tests_fixtures_test_bundle_entity_dummy_api_platform_core_bridge_doctrine_orm_filter_date_filter')->shouldBeCalled()->willReturn(false);
7374

75+
$containerBuilderProphecy->has(SearchFilter::class)->willReturn(false)->shouldBeCalled();
76+
$containerBuilderProphecy->has(GroupFilter::class)->willReturn(false)->shouldBeCalled();
77+
$containerBuilderProphecy->has(DateFilter::class)->willReturn(true)->shouldBeCalled();
78+
79+
$containerBuilderProphecy->findDefinition(DateFilter::class)->willReturn((new Definition(DateFilter::class))->setAbstract(true))->shouldBeCalled();
80+
7481
$containerBuilderProphecy->setDefinition('annotated_api_platform_core_tests_fixtures_test_bundle_entity_dummy_api_platform_core_bridge_doctrine_orm_filter_search_filter', Argument::that(function ($def) {
7582
$this->assertInstanceOf(Definition::class, $def);
7683
$this->assertEquals(SearchFilter::class, $def->getClass());
@@ -88,8 +95,8 @@ public function testProcess()
8895
}))->shouldBeCalled();
8996

9097
$containerBuilderProphecy->setDefinition('annotated_api_platform_core_tests_fixtures_test_bundle_entity_dummy_api_platform_core_bridge_doctrine_orm_filter_date_filter', Argument::that(function ($def) {
91-
$this->assertInstanceOf(Definition::class, $def);
92-
$this->assertEquals(DateFilter::class, $def->getClass());
98+
$this->assertInstanceOf(ChildDefinition::class, $def);
99+
$this->assertEquals(DateFilter::class, $def->getParent());
93100
$this->assertEquals(['$properties' => ['dummyDate' => null]], $def->getArguments());
94101

95102
return true;

0 commit comments

Comments
 (0)