1313
1414namespace ApiPlatform \Doctrine \Odm \Extension ;
1515
16+ use ApiPlatform \Doctrine \Common \Filter \ManagerRegistryAwareInterface ;
1617use ApiPlatform \Doctrine \Common \ParameterValueExtractorTrait ;
18+ use ApiPlatform \Doctrine \Odm \Filter \AbstractFilter ;
1719use ApiPlatform \Doctrine \Odm \Filter \FilterInterface ;
1820use ApiPlatform \Metadata \Operation ;
1921use ApiPlatform \State \ParameterNotFound ;
22+ use Doctrine \Bundle \MongoDBBundle \ManagerRegistry ;
2023use Doctrine \ODM \MongoDB \Aggregation \Builder ;
2124use Psr \Container \ContainerInterface ;
2225
@@ -29,14 +32,20 @@ final class ParameterExtension implements AggregationCollectionExtensionInterfac
2932{
3033 use ParameterValueExtractorTrait;
3134
32- public function __construct (private readonly ContainerInterface $ filterLocator )
33- {
35+ public function __construct (
36+ private readonly ContainerInterface $ filterLocator ,
37+ private readonly ?ManagerRegistry $ managerRegistry = null ,
38+ ) {
3439 }
3540
41+ /**
42+ * @param array<string, mixed> $context
43+ */
3644 private function applyFilter (Builder $ aggregationBuilder , ?string $ resourceClass = null , ?Operation $ operation = null , array &$ context = []): void
3745 {
3846 foreach ($ operation ->getParameters () ?? [] as $ parameter ) {
39- if (!($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
47+ // TODO: remove the null equality as a parameter can have a null value
48+ if (null === ($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
4049 continue ;
4150 }
4251
@@ -45,14 +54,30 @@ private function applyFilter(Builder $aggregationBuilder, ?string $resourceClass
4554 continue ;
4655 }
4756
48- $ filter = $ this ->filterLocator ->has ($ filterId ) ? $ this ->filterLocator ->get ($ filterId ) : null ;
49- if ($ filter instanceof FilterInterface) {
50- $ filterContext = ['filters ' => $ values , 'parameter ' => $ parameter ];
51- $ filter ->apply ($ aggregationBuilder , $ resourceClass , $ operation , $ filterContext );
52- // update by reference
53- if (isset ($ filterContext ['mongodb_odm_sort_fields ' ])) {
54- $ context ['mongodb_odm_sort_fields ' ] = $ filterContext ['mongodb_odm_sort_fields ' ];
55- }
57+ $ filter = match (true ) {
58+ $ filterId instanceof FilterInterface => $ filterId ,
59+ \is_string ($ filterId ) && $ this ->filterLocator ->has ($ filterId ) => $ this ->filterLocator ->get ($ filterId ),
60+ default => null ,
61+ };
62+
63+ if (!$ filter instanceof FilterInterface) {
64+ continue ;
65+ }
66+
67+ if ($ filter instanceof ManagerRegistryAwareInterface && !$ filter ->hasManagerRegistry ()) {
68+ $ filter ->setManagerRegistry ($ this ->managerRegistry );
69+ }
70+
71+ if ($ filter instanceof AbstractFilter && !$ filter ->getProperties ()) {
72+ $ propertyKey = $ parameter ->getProperty () ?? $ parameter ->getKey ();
73+ $ filter ->setProperties ([$ propertyKey => $ parameter ->getFilterContext ()]);
74+ }
75+
76+ $ filterContext = ['filters ' => $ values , 'parameter ' => $ parameter ];
77+ $ filter ->apply ($ aggregationBuilder , $ resourceClass , $ operation , $ filterContext );
78+ // update by reference
79+ if (isset ($ filterContext ['mongodb_odm_sort_fields ' ])) {
80+ $ context ['mongodb_odm_sort_fields ' ] = $ filterContext ['mongodb_odm_sort_fields ' ];
5681 }
5782 }
5883 }
0 commit comments