Skip to content

Commit dc835c9

Browse files
review
1 parent a68a6d4 commit dc835c9

File tree

5 files changed

+51
-39
lines changed

5 files changed

+51
-39
lines changed

phpstan.neon.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ parameters:
224224
- src/Core/Upgrade/SubresourceTransformer.php
225225
- src/Core/Upgrade/UpgradeApiResourceVisitor.php
226226
- src/Core/Upgrade/UpgradeApiSubresourceVisitor.php
227+
- src/Core/Upgrade/UpgradeApiFilterVisitor.php
227228
- src/Core/Util/AttributesExtractor.php
228229
- src/Core/Util/ErrorFormatGuesser.php
229230
- src/Core/Util/Inflector.php

src/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommand.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
use ApiPlatform\Core\Operation\Factory\SubresourceOperationFactoryInterface;
2020
use ApiPlatform\Core\Upgrade\ColorConsoleDiffFormatter;
2121
use ApiPlatform\Core\Upgrade\SubresourceTransformer;
22-
use ApiPlatform\Core\Upgrade\UpgradeApiResourceVisitor;
2322
use ApiPlatform\Core\Upgrade\UpgradeApiFilterVisitor;
23+
use ApiPlatform\Core\Upgrade\UpgradeApiResourceVisitor;
2424
use ApiPlatform\Core\Upgrade\UpgradeApiSubresourceVisitor;
2525
use ApiPlatform\Exception\ResourceClassNotFoundException;
2626
use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
@@ -107,8 +107,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int
107107

108108
$traverser = new NodeTraverser();
109109
[$attribute, $isAnnotation] = $this->readApiResource($resourceClass);
110-
111-
$traverser->addVisitor(new UpgradeApiFilterVisitor($this->reader, $resourceClass, $attribute));
110+
111+
$traverser->addVisitor(new UpgradeApiFilterVisitor($this->reader, $resourceClass));
112112

113113
if (!$attribute) {
114114
continue;

src/Core/Upgrade/UpgradeApiFilterVisitor.php

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,20 @@
1414
namespace ApiPlatform\Core\Upgrade;
1515

1616
use ApiPlatform\Core\Annotation\ApiFilter as LegacyApiFilter;
17-
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter as LegacySearchFilter;
18-
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter as LegacyExistsFilter;
17+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter as LegacyBooleanFilter;
1918
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter as LegacyDateFilter;
20-
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
21-
use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter;
19+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter as LegacyExistsFilter;
20+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter as LegacyNumericFilter;
21+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter as LegacyOrderFilter;
22+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter as LegacyRangeFilter;
23+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter as LegacySearchFilter;
24+
use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter;
2225
use ApiPlatform\Doctrine\Orm\Filter\DateFilter;
26+
use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter;
27+
use ApiPlatform\Doctrine\Orm\Filter\NumericFilter;
28+
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
29+
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter;
30+
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
2331
use ApiPlatform\Metadata\ApiFilter;
2432
use ApiPlatform\Metadata\Resource\DeprecationMetadataTrait;
2533
use Doctrine\Common\Annotations\AnnotationReader;
@@ -51,6 +59,10 @@ public function enterNode(Node $node)
5159
SearchFilter::class,
5260
ExistsFilter::class,
5361
DateFilter::class,
62+
BooleanFilter::class,
63+
NumericFilter::class,
64+
OrderFilter::class,
65+
RangeFilter::class,
5466
];
5567

5668
foreach ($node->stmts as $k => $stmt) {
@@ -76,9 +88,22 @@ public function enterNode(Node $node)
7688
unset($node->stmts[$k]);
7789
continue;
7890
}
79-
80-
81-
91+
if (LegacyBooleanFilter::class === $useStatement) {
92+
unset($node->stmts[$k]);
93+
continue;
94+
}
95+
if (LegacyNumericFilter::class === $useStatement) {
96+
unset($node->stmts[$k]);
97+
continue;
98+
}
99+
if (LegacyOrderFilter::class === $useStatement) {
100+
unset($node->stmts[$k]);
101+
continue;
102+
}
103+
if (LegacyRangeFilter::class === $useStatement) {
104+
unset($node->stmts[$k]);
105+
continue;
106+
}
82107

83108
if (false !== ($key = array_search($useStatement, $namespaces, true))) {
84109
unset($namespaces[$key]);
@@ -96,16 +121,13 @@ public function enterNode(Node $node)
96121
}
97122
}
98123

99-
if ($node instanceof Node\Stmt\Property || $node instanceof Node\Stmt\Class_) {
124+
if ($node instanceof Node\Stmt\Property || $node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Interface_) {
100125
if ($node instanceof Node\Stmt\Property) {
101126
$reflection = $this->reflectionClass->getProperty($node->props[0]->name->__toString());
102127
} else {
103128
$reflection = $this->reflectionClass;
104129
}
105130

106-
// filter annotation : array
107-
$filterAnnotations = $this->readApiFilters($reflection);
108-
109131
foreach ($this->readApiFilters($reflection) as $annotation) {
110132
[$filterAnnotation, $isAnnotation] = $annotation;
111133
if ($isAnnotation) {
@@ -122,19 +144,11 @@ public function enterNode(Node $node)
122144
'properties',
123145
'arguments',
124146
] as $key) {
125-
$value = $filterAnnotation->{$key};
126-
if (null === $value || [] === $value) {
127-
continue;
128-
}
129-
$arguments[$key] = $this->valueToNode($value);
147+
$value = $filterAnnotation->{$key};
130148

131-
}
132-
foreach ($filterAnnotation->attributes ?? [] as $key => $value) {
133-
if (null === $value || [] === $value) {
149+
if (!$value) {
134150
continue;
135151
}
136-
137-
[$key, $value] = $this->getKeyValue($key, $value);
138152
$arguments[$key] = $this->valueToNode($value);
139153
}
140154

@@ -146,15 +160,14 @@ public function enterNode(Node $node)
146160
]));
147161
}
148162
}
149-
150163
}
151164

152-
private function readApiFilters(\ReflectionProperty|\ReflectionClass $reflection): ?\Generator
165+
private function readApiFilters(\ReflectionProperty|\ReflectionClass|\ReflectionInterface $reflection): ?\Generator
153166
{
154167
if (\PHP_VERSION_ID >= 80000 && $attributes = $reflection->getAttributes(LegacyApiFilter::class)) {
155-
yield from array_map(function($attribute) {
156-
return $attribute->newInstance();
157-
} , $attributes);
168+
yield from array_map(function ($attribute) {
169+
return [$attribute->newInstance(), false];
170+
}, $attributes);
158171
}
159172

160173
if (null === $this->reader) {
@@ -165,7 +178,6 @@ private function readApiFilters(\ReflectionProperty|\ReflectionClass $reflection
165178
$annotations = $this->reader->getPropertyAnnotations($reflection);
166179
} else {
167180
$annotations = $this->reader->getClassAnnotations($reflection);
168-
169181
}
170182

171183
foreach ($annotations as $annotation) {
@@ -236,14 +248,14 @@ private function arrayToArguments(array $arguments)
236248
{
237249
$args = [];
238250
foreach ($arguments as $key => $value) {
239-
if ($value)
251+
if ($value) {
240252
$args[] = new Node\Arg($value, false, false, [], new Node\Identifier($key));
253+
}
241254
}
242255

243256
return $args;
244257
}
245258

246-
247259
private function getShortName(string $class): string
248260
{
249261
if (false !== $pos = strrpos($class, '\\')) {
@@ -252,5 +264,4 @@ private function getShortName(string $class): string
252264

253265
return $class;
254266
}
255-
256267
}

tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ public function testDebugResource()
105105
"+#[ApiResource(graphQlOperations: [new Query(name: 'item_query'), new Mutation(name: 'update', normalizationContext: ['groups' => ['chicago', 'fakemanytomany']], denormalizationContext: ['groups' => ['friends']])], types: ['https://schema.org/Product'], normalizationContext: ['groups' => ['friends']], filters: ['related_dummy.friends', 'related_dummy.complex_sub_query'])]",
106106
"#[ApiResource(uriTemplate: '/related_dummies/{id}/id.{_format}', uriVariables: ['id' => new Link(fromClass: self::class, identifiers: ['id'])], status: 200, types: ['https://schema.org/Product'], filters: ['related_dummy.friends', 'related_dummy.complex_sub_query'], normalizationContext: ['groups' => ['friends']], operations: [new Get()])]",
107107
"+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id', 'name'])]",
108-
"+ #[ApiFilter(filterClass: SearchFilter::class)]",
109-
"+ #[ApiFilter(filterClass: ExistsFilter::class)]",
110-
"+ #[ApiFilter(filterClass: DateFilter::class)]",
108+
'+ #[ApiFilter(filterClass: SearchFilter::class)]',
109+
'+ #[ApiFilter(filterClass: ExistsFilter::class)]',
110+
'+ #[ApiFilter(filterClass: DateFilter::class)]',
111111
];
112112

113113
$display = $commandTester->getDisplay();

tests/Fixtures/TestBundle/Entity/RelatedDummy.php

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

1414
namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity;
1515

16+
use ApiPlatform\Core\Annotation\ApiFilter;
1617
use ApiPlatform\Core\Annotation\ApiProperty;
1718
use ApiPlatform\Core\Annotation\ApiResource;
18-
use ApiPlatform\Core\Annotation\ApiFilter;
1919
use ApiPlatform\Core\Annotation\ApiSubresource;
20-
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
21-
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter;
2220
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
21+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter;
22+
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
2323
use Doctrine\Common\Collections\ArrayCollection;
2424
use Doctrine\Common\Collections\Collection;
2525
use Doctrine\ORM\Mapping as ORM;

0 commit comments

Comments
 (0)