1414namespace ApiPlatform \Doctrine \Orm \Extension ;
1515
1616use ApiPlatform \Doctrine \Common \ParameterValueExtractorTrait ;
17+ use ApiPlatform \Doctrine \Orm \Filter \AbstractFilter ;
1718use ApiPlatform \Doctrine \Orm \Filter \FilterInterface ;
1819use ApiPlatform \Doctrine \Orm \Util \QueryNameGeneratorInterface ;
1920use ApiPlatform \Metadata \Operation ;
2021use ApiPlatform \State \ParameterNotFound ;
2122use Doctrine \ORM \QueryBuilder ;
23+ use Psr \Container \ContainerExceptionInterface ;
2224use Psr \Container \ContainerInterface ;
25+ use Psr \Container \NotFoundExceptionInterface ;
26+ use Symfony \Bridge \Doctrine \ManagerRegistry ;
2327
2428/**
2529 * Reads operation parameters and execute its filter.
@@ -30,17 +34,22 @@ final class ParameterExtension implements QueryCollectionExtensionInterface, Que
3034{
3135 use ParameterValueExtractorTrait;
3236
33- public function __construct (private readonly ContainerInterface $ filterLocator )
34- {
37+ public function __construct (
38+ private readonly ContainerInterface $ filterLocator ,
39+ private readonly ?ManagerRegistry $ managerRegistry = null ,
40+ ) {
3541 }
3642
3743 /**
3844 * @param array<string, mixed> $context
45+ *
46+ * @throws ContainerExceptionInterface
47+ * @throws NotFoundExceptionInterface
3948 */
4049 private function applyFilter (QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ resourceClass , ?Operation $ operation = null , array $ context = []): void
4150 {
4251 foreach ($ operation ?->getParameters() ?? [] as $ parameter ) {
43- if (! ($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
52+ if (null === ($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
4453 continue ;
4554 }
4655
@@ -49,9 +58,12 @@ private function applyFilter(QueryBuilder $queryBuilder, QueryNameGeneratorInter
4958 continue ;
5059 }
5160
52- $ filter = $ this ->filterLocator ->has ($ filterId ) ? $ this ->filterLocator ->get ($ filterId ) : null ;
61+ $ filter = $ this ->getFilter ($ filterId , $ values );
62+
5363 if ($ filter instanceof FilterInterface) {
54- $ filter ->apply ($ queryBuilder , $ queryNameGenerator , $ resourceClass , $ operation , ['filters ' => $ values , 'parameter ' => $ parameter ] + $ context );
64+ $ filter ->apply ($ queryBuilder , $ queryNameGenerator , $ resourceClass , $ operation ,
65+ ['filters ' => $ values , 'parameter ' => $ parameter ] + $ context
66+ );
5567 }
5668 }
5769 }
@@ -71,4 +83,26 @@ public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterf
7183 {
7284 $ this ->applyFilter ($ queryBuilder , $ queryNameGenerator , $ resourceClass , $ operation , $ context );
7385 }
86+
87+ /**
88+ * @param $values array<string, string>
89+ *
90+ * @throws ContainerExceptionInterface
91+ * @throws NotFoundExceptionInterface
92+ */
93+ private function getFilter (AbstractFilter |string |null $ filterId , array $ values = []): ?FilterInterface
94+ {
95+ if ($ filterId instanceof AbstractFilter) {
96+ $ filterId ->setManagerRegistry ($ this ->managerRegistry );
97+ $ filterId ->setProperties ($ values );
98+
99+ return $ filterId ;
100+ }
101+
102+ if (\is_string ($ filterId ) && $ this ->filterLocator ->has ($ filterId )) {
103+ return $ this ->filterLocator ->get ($ filterId );
104+ }
105+
106+ return null ;
107+ }
74108}
0 commit comments