13
13
14
14
namespace ApiPlatform \Doctrine \Odm \Extension ;
15
15
16
+ use ApiPlatform \Doctrine \Common \Filter \ManagerRegistryAwareInterface ;
16
17
use ApiPlatform \Doctrine \Common \ParameterValueExtractorTrait ;
18
+ use ApiPlatform \Doctrine \Odm \Filter \AbstractFilter ;
17
19
use ApiPlatform \Doctrine \Odm \Filter \FilterInterface ;
18
20
use ApiPlatform \Metadata \Operation ;
19
21
use ApiPlatform \State \ParameterNotFound ;
22
+ use Doctrine \Bundle \MongoDBBundle \ManagerRegistry ;
20
23
use Doctrine \ODM \MongoDB \Aggregation \Builder ;
21
24
use Psr \Container \ContainerInterface ;
22
25
@@ -29,14 +32,20 @@ final class ParameterExtension implements AggregationCollectionExtensionInterfac
29
32
{
30
33
use ParameterValueExtractorTrait;
31
34
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
+ ) {
34
39
}
35
40
41
+ /**
42
+ * @param array<string, mixed> $context
43
+ */
36
44
private function applyFilter (Builder $ aggregationBuilder , ?string $ resourceClass = null , ?Operation $ operation = null , array &$ context = []): void
37
45
{
38
46
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) {
40
49
continue ;
41
50
}
42
51
@@ -45,14 +54,33 @@ private function applyFilter(Builder $aggregationBuilder, ?string $resourceClass
45
54
continue ;
46
55
}
47
56
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
+ $ filterContext = $ parameter ->getFilterContext ();
74
+
75
+ $ properties = \is_array ($ filterContext ) ? $ filterContext : [$ propertyKey => $ filterContext ];
76
+ $ filter ->setProperties ($ properties );
77
+ }
78
+
79
+ $ filterContext = ['filters ' => $ values , 'parameter ' => $ parameter ];
80
+ $ filter ->apply ($ aggregationBuilder , $ resourceClass , $ operation , $ filterContext );
81
+ // update by reference
82
+ if (isset ($ filterContext ['mongodb_odm_sort_fields ' ])) {
83
+ $ context ['mongodb_odm_sort_fields ' ] = $ filterContext ['mongodb_odm_sort_fields ' ];
56
84
}
57
85
}
58
86
}
0 commit comments