1414namespace ApiPlatform \Doctrine \Orm \Extension ;
1515
1616use ApiPlatform \Doctrine \Common \ParameterValueExtractorTrait ;
17+ use ApiPlatform \Doctrine \Orm \Filter \AbstractFilter ;
1718use ApiPlatform \Doctrine \Orm \Filter \FilterInterface ;
19+ use ApiPlatform \Doctrine \Orm \Filter \ManagerRegistryConfigurableInterface ;
1820use ApiPlatform \Doctrine \Orm \Util \QueryNameGeneratorInterface ;
1921use ApiPlatform \Metadata \Operation ;
2022use ApiPlatform \State \ParameterNotFound ;
2123use Doctrine \ORM \QueryBuilder ;
24+ use Psr \Container \ContainerExceptionInterface ;
2225use Psr \Container \ContainerInterface ;
26+ use Psr \Container \NotFoundExceptionInterface ;
27+ use Symfony \Bridge \Doctrine \ManagerRegistry ;
2328
2429/**
2530 * Reads operation parameters and execute its filter.
@@ -30,17 +35,22 @@ final class ParameterExtension implements QueryCollectionExtensionInterface, Que
3035{
3136 use ParameterValueExtractorTrait;
3237
33- public function __construct (private readonly ContainerInterface $ filterLocator )
34- {
38+ public function __construct (
39+ private readonly ContainerInterface $ filterLocator ,
40+ private readonly ?ManagerRegistry $ managerRegistry = null ,
41+ ) {
3542 }
3643
3744 /**
3845 * @param array<string, mixed> $context
46+ *
47+ * @throws ContainerExceptionInterface
48+ * @throws NotFoundExceptionInterface
3949 */
4050 private function applyFilter (QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ resourceClass , ?Operation $ operation = null , array $ context = []): void
4151 {
4252 foreach ($ operation ?->getParameters() ?? [] as $ parameter ) {
43- if (! ($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
53+ if (null === ($ v = $ parameter ->getValue ()) || $ v instanceof ParameterNotFound) {
4454 continue ;
4555 }
4656
@@ -49,10 +59,28 @@ private function applyFilter(QueryBuilder $queryBuilder, QueryNameGeneratorInter
4959 continue ;
5060 }
5161
52- $ filter = $ this ->filterLocator ->has ($ filterId ) ? $ this ->filterLocator ->get ($ filterId ) : null ;
53- if ($ filter instanceof FilterInterface) {
54- $ filter ->apply ($ queryBuilder , $ queryNameGenerator , $ resourceClass , $ operation , ['filters ' => $ values , 'parameter ' => $ parameter ] + $ context );
62+ $ filter = match (true ) {
63+ $ filterId instanceof AbstractFilter => $ filterId ,
64+ \is_string ($ filterId ) && $ this ->filterLocator ->has ($ filterId ) => $ this ->filterLocator ->get ($ filterId ),
65+ default => null ,
66+ };
67+
68+ if (!($ filter instanceof FilterInterface)) {
69+ return ;
70+ }
71+
72+ if (!$ filter ->hasManagerRegistry () && $ filter instanceof ManagerRegistryConfigurableInterface) {
73+ $ filter ->setManagerRegistry ($ this ->managerRegistry );
5574 }
75+
76+ if ([] === $ filter ->getProperties () || null === $ filter ->getProperties ()) {
77+ $ key = $ parameter ->getProperty () ?? $ parameter ->getKey ();
78+ $ filter ->setProperties ([$ key => []]);
79+ }
80+
81+ $ filter ->apply ($ queryBuilder , $ queryNameGenerator , $ resourceClass , $ operation ,
82+ ['filters ' => $ values , 'parameter ' => $ parameter ] + $ context
83+ );
5684 }
5785 }
5886
0 commit comments