Skip to content

Commit 5463112

Browse files
committed
refactor checkme
1 parent 849e4b7 commit 5463112

File tree

5 files changed

+217
-67
lines changed

5 files changed

+217
-67
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Doctrine\Common\Extension;
15+
16+
use ApiPlatform\Doctrine\Common\Filter\LoggerAwareInterface;
17+
use ApiPlatform\Doctrine\Common\Filter\ManagerRegistryAwareInterface;
18+
use ApiPlatform\Doctrine\Common\Filter\ParameterAwareFilterInterface;
19+
use ApiPlatform\Doctrine\Common\Filter\PropertyAwareFilterInterface;
20+
use ApiPlatform\Doctrine\Common\ParameterValueExtractorTrait;
21+
use ApiPlatform\Metadata\Operation;
22+
use ApiPlatform\State\ParameterNotFound;
23+
use Doctrine\Persistence\ManagerRegistry;
24+
use Psr\Container\ContainerInterface;
25+
use Psr\Log\LoggerInterface;
26+
27+
/**
28+
* Reads operation parameters and execute its filter.
29+
*
30+
* @author Antoine Bluchet <[email protected]>
31+
*/
32+
abstract class ParameterExtension
33+
{
34+
use ParameterValueExtractorTrait;
35+
36+
public function __construct(
37+
protected readonly ContainerInterface $filterLocator,
38+
protected readonly ?ManagerRegistry $managerRegistry = null,
39+
protected readonly ?LoggerInterface $logger = null,
40+
) {
41+
}
42+
43+
/**
44+
* @param array<string, mixed> $context
45+
*/
46+
protected function applyFilter(object $queryBuilder, string $resourceClass, ?Operation $operation = null, array &$context = []): void
47+
{
48+
foreach ($operation->getParameters() ?? [] as $parameter) {
49+
if (null === ($v = $parameter->getValue()) || $v instanceof ParameterNotFound) {
50+
continue;
51+
}
52+
53+
$values = $this->extractParameterValue($parameter, $v);
54+
if (null === ($filterId = $parameter->getFilter())) {
55+
continue;
56+
}
57+
58+
$filter = match (true) {
59+
$filterId instanceof ParameterAwareFilterInterface => $filterId,
60+
\is_string($filterId) && $this->filterLocator->has($filterId) => $this->filterLocator->get($filterId),
61+
default => null,
62+
};
63+
64+
if (!$filter instanceof ParameterAwareFilterInterface) {
65+
continue;
66+
}
67+
68+
if ($this->managerRegistry && $filter instanceof ManagerRegistryAwareInterface && !$filter->hasManagerRegistry()) {
69+
$filter->setManagerRegistry($this->managerRegistry);
70+
}
71+
72+
if ($this->logger && $filter instanceof LoggerAwareInterface && !$filter->hasLogger()) {
73+
$filter->setLogger($this->logger);
74+
}
75+
76+
if ($filter instanceof PropertyAwareFilterInterface) {
77+
$properties = [];
78+
$propertyKey = $parameter->getProperty() ?? $parameter->getKey();
79+
80+
if (method_exists($filter, 'getProperties')) {
81+
$properties = $filter->getProperties() ?? [];
82+
}
83+
84+
foreach ($parameter->getProperties() ?? [$propertyKey] as $property) {
85+
if (!isset($properties[$property])) {
86+
$properties[$property] = $parameter->getFilterContext();
87+
}
88+
}
89+
90+
$filter->setProperties($properties);
91+
}
92+
93+
$context['filters'] = $values;
94+
$context['parameter'] = $parameter;
95+
96+
$filter->apply($queryBuilder, $resourceClass, $operation, $context);
97+
98+
unset($context['filters'], $context['parameter']);
99+
}
100+
}
101+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Doctrine\Common\Filter;
15+
16+
use ApiPlatform\Metadata\Operation;
17+
18+
/**
19+
* Interface for filters that can be applied by a ParameterExtension.
20+
*
21+
* @author Antoine Bluchet <[email protected]>
22+
*/
23+
interface ParameterAwareFilterInterface
24+
{
25+
/**
26+
* Applies the filter to the query.
27+
*
28+
* @param array<string, mixed> $context
29+
*/
30+
public function apply(object $queryBuilder, string $resourceClass, ?Operation $operation = null, array &$context = []): void;
31+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Doctrine\Common;
15+
16+
use ApiPlatform\Doctrine\Common\Filter\LoggerAwareInterface;
17+
use ApiPlatform\Doctrine\Common\Filter\ManagerRegistryAwareInterface;
18+
use ApiPlatform\Doctrine\Common\Filter\PropertyAwareFilterInterface;
19+
use ApiPlatform\Metadata\Parameter;
20+
use Doctrine\Persistence\ManagerRegistry;
21+
use Psr\Container\ContainerInterface;
22+
use Psr\Log\LoggerInterface;
23+
24+
trait ParameterExtensionTrait
25+
{
26+
use ParameterValueExtractorTrait;
27+
28+
protected ContainerInterface $filterLocator;
29+
protected ?ManagerRegistry $managerRegistry = null;
30+
protected ?LoggerInterface $logger = null;
31+
32+
/**
33+
* Configures a filter with common properties like ManagerRegistry, Logger, and PropertyAwareFilterInterface properties.
34+
*
35+
* @param object $filter the filter instance to configure
36+
* @param Parameter $parameter the operation parameter associated with the filter
37+
*/
38+
private function configureFilter(object $filter, Parameter $parameter): void
39+
{
40+
if ($this->managerRegistry && $filter instanceof ManagerRegistryAwareInterface && !$filter->hasManagerRegistry()) {
41+
$filter->setManagerRegistry($this->managerRegistry);
42+
}
43+
44+
if ($this->logger && $filter instanceof LoggerAwareInterface && !$filter->hasLogger()) {
45+
$filter->setLogger($this->logger);
46+
}
47+
48+
if ($filter instanceof PropertyAwareFilterInterface) {
49+
$properties = [];
50+
// Check if the filter has getProperties method (e.g., if it's an AbstractFilter)
51+
if (method_exists($filter, 'getProperties')) {
52+
$properties = $filter->getProperties() ?? [];
53+
}
54+
55+
$propertyKey = $parameter->getProperty() ?? $parameter->getKey();
56+
foreach ($parameter->getProperties() ?? [$propertyKey] as $property) {
57+
if (!isset($properties[$property])) {
58+
$properties[$property] = $parameter->getFilterContext();
59+
}
60+
}
61+
62+
$filter->setProperties($properties);
63+
}
64+
}
65+
}

src/Doctrine/Odm/Extension/ParameterExtension.php

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313

1414
namespace ApiPlatform\Doctrine\Odm\Extension;
1515

16-
use ApiPlatform\Doctrine\Common\Filter\LoggerAwareInterface;
17-
use ApiPlatform\Doctrine\Common\Filter\ManagerRegistryAwareInterface;
18-
use ApiPlatform\Doctrine\Common\ParameterValueExtractorTrait;
19-
use ApiPlatform\Doctrine\Odm\Filter\AbstractFilter;
20-
use ApiPlatform\Doctrine\Odm\Filter\FilterInterface;
16+
use ApiPlatform\Doctrine\Common\Filter\PropertyAwareFilterInterface;
17+
use ApiPlatform\Doctrine\Common\ParameterExtensionTrait;
18+
use ApiPlatform\Doctrine\Odm\Filter\FilterInterface; // Explicitly import PropertyAwareFilterInterface
2119
use ApiPlatform\Metadata\Operation;
2220
use ApiPlatform\State\ParameterNotFound;
2321
use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
@@ -32,13 +30,16 @@
3230
*/
3331
final class ParameterExtension implements AggregationCollectionExtensionInterface, AggregationItemExtensionInterface
3432
{
35-
use ParameterValueExtractorTrait;
33+
use ParameterExtensionTrait;
3634

3735
public function __construct(
38-
private readonly ContainerInterface $filterLocator,
39-
private readonly ?ManagerRegistry $managerRegistry = null,
40-
private readonly ?LoggerInterface $logger = null,
36+
ContainerInterface $filterLocator,
37+
?ManagerRegistry $managerRegistry = null,
38+
?LoggerInterface $logger = null,
4139
) {
40+
$this->filterLocator = $filterLocator;
41+
$this->managerRegistry = $managerRegistry;
42+
$this->logger = $logger;
4243
}
4344

4445
/**
@@ -66,31 +67,7 @@ private function applyFilter(Builder $aggregationBuilder, ?string $resourceClass
6667
continue;
6768
}
6869

69-
if ($this->managerRegistry && $filter instanceof ManagerRegistryAwareInterface && !$filter->hasManagerRegistry()) {
70-
$filter->setManagerRegistry($this->managerRegistry);
71-
}
72-
73-
if ($this->logger && $filter instanceof LoggerAwareInterface && !$filter->hasLogger()) {
74-
$filter->setLogger($this->logger);
75-
}
76-
77-
// Repeated inside ORM Move this to common ?
78-
if ($filter instanceof PropertyAwareFilterInterface) {
79-
$properties = [];
80-
$propertyKey = $parameter->getProperty() ?? $parameter->getKey();
81-
82-
if ($filter instanceof AbstractFilter) {
83-
$properties = $filter->getProperties() ?? [];
84-
}
85-
86-
foreach ($parameter->getProperties() ?? [$propertyKey] as $property) {
87-
if (!isset($properties[$property])) {
88-
$properties[$property] = $parameter->getFilterContext();
89-
}
90-
}
91-
92-
$filter->setProperties($properties);
93-
}
70+
$this->configureFilter($filter, $parameter);
9471

9572
$context['filters'] = $values;
9673
$context['parameter'] = $parameter;

src/Doctrine/Orm/Extension/ParameterExtension.php

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313

1414
namespace ApiPlatform\Doctrine\Orm\Extension;
1515

16-
use ApiPlatform\Doctrine\Common\Filter\LoggerAwareInterface;
17-
use ApiPlatform\Doctrine\Common\Filter\ManagerRegistryAwareInterface;
1816
use ApiPlatform\Doctrine\Common\Filter\PropertyAwareFilterInterface;
19-
use ApiPlatform\Doctrine\Common\ParameterValueExtractorTrait;
20-
use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
17+
use ApiPlatform\Doctrine\Common\ParameterExtensionTrait; // Explicitly import PropertyAwareFilterInterface
2118
use ApiPlatform\Doctrine\Orm\Filter\FilterInterface;
2219
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
2320
use ApiPlatform\Metadata\Operation;
@@ -34,13 +31,16 @@
3431
*/
3532
final class ParameterExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
3633
{
37-
use ParameterValueExtractorTrait;
34+
use ParameterExtensionTrait;
3835

3936
public function __construct(
40-
private readonly ContainerInterface $filterLocator,
41-
private readonly ?ManagerRegistry $managerRegistry = null,
42-
private readonly ?LoggerInterface $logger = null,
37+
ContainerInterface $filterLocator,
38+
?ManagerRegistry $managerRegistry = null,
39+
?LoggerInterface $logger = null,
4340
) {
41+
$this->filterLocator = $filterLocator;
42+
$this->managerRegistry = $managerRegistry;
43+
$this->logger = $logger;
4444
}
4545

4646
/**
@@ -68,31 +68,7 @@ private function applyFilter(QueryBuilder $queryBuilder, QueryNameGeneratorInter
6868
continue;
6969
}
7070

71-
if ($this->managerRegistry && $filter instanceof ManagerRegistryAwareInterface && !$filter->hasManagerRegistry()) {
72-
$filter->setManagerRegistry($this->managerRegistry);
73-
}
74-
75-
if ($this->logger && $filter instanceof LoggerAwareInterface && !$filter->hasLogger()) {
76-
$filter->setLogger($this->logger);
77-
}
78-
79-
// Repeated inside ODM Move this to common ?
80-
if ($filter instanceof PropertyAwareFilterInterface) {
81-
$properties = [];
82-
$propertyKey = $parameter->getProperty() ?? $parameter->getKey();
83-
84-
if ($filter instanceof AbstractFilter) {
85-
$properties = $filter->getProperties() ?? [];
86-
}
87-
88-
foreach ($parameter->getProperties() ?? [$propertyKey] as $property) {
89-
if (!isset($properties[$property])) {
90-
$properties[$property] = $parameter->getFilterContext();
91-
}
92-
}
93-
94-
$filter->setProperties($properties);
95-
}
71+
$this->configureFilter($filter, $parameter);
9672

9773
$filter->apply($queryBuilder, $queryNameGenerator, $resourceClass, $operation,
9874
['filters' => $values, 'parameter' => $parameter] + $context

0 commit comments

Comments
 (0)