Skip to content

Commit 93e4b3d

Browse files
authored
fix(state): store parameter value without its key (#6456)
1 parent 83745df commit 93e4b3d

File tree

7 files changed

+28
-21
lines changed

7 files changed

+28
-21
lines changed

src/Doctrine/Common/ParameterValueExtractorTrait.php

+6-10
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,20 @@
1313

1414
namespace ApiPlatform\Doctrine\Common;
1515

16+
use ApiPlatform\Metadata\Parameter;
17+
1618
trait ParameterValueExtractorTrait
1719
{
1820
/**
19-
* @param array<string, mixed> $values
20-
*
2121
* @return array<string, mixed>
2222
*/
23-
private function extractParameterValue(array $values): array
23+
private function extractParameterValue(Parameter $parameter, mixed $value): array
2424
{
25-
if (!$values) {
26-
return $values;
27-
}
28-
29-
$key = key($values);
25+
$key = $parameter->getKey();
3026
if (!str_contains($key, ':property')) {
31-
return $values;
27+
return [$key => $value];
3228
}
3329

34-
return [str_replace('[:property]', '', $key) => $values[$key]];
30+
return [str_replace('[:property]', '', $key) => $value];
3531
}
3632
}

src/Doctrine/Odm/Extension/ParameterExtension.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Doctrine\Common\ParameterValueExtractorTrait;
1717
use ApiPlatform\Doctrine\Odm\Filter\FilterInterface;
1818
use ApiPlatform\Metadata\Operation;
19+
use ApiPlatform\State\ParameterNotFound;
1920
use Doctrine\ODM\MongoDB\Aggregation\Builder;
2021
use Psr\Container\ContainerInterface;
2122

@@ -35,11 +36,11 @@ public function __construct(private readonly ContainerInterface $filterLocator)
3536
private function applyFilter(Builder $aggregationBuilder, ?string $resourceClass = null, ?Operation $operation = null, array &$context = []): void
3637
{
3738
foreach ($operation->getParameters() ?? [] as $parameter) {
38-
$values = $this->extractParameterValue($parameter->getValue() ?? []);
39-
if (!$values) {
39+
if (!($v = $parameter->getValue()) || $v instanceof ParameterNotFound) {
4040
continue;
4141
}
4242

43+
$values = $this->extractParameterValue($parameter, $v);
4344
if (null === ($filterId = $parameter->getFilter())) {
4445
continue;
4546
}

src/Doctrine/Orm/Extension/ParameterExtension.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use ApiPlatform\Doctrine\Orm\Filter\FilterInterface;
1818
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
1919
use ApiPlatform\Metadata\Operation;
20+
use ApiPlatform\State\ParameterNotFound;
2021
use Doctrine\ORM\QueryBuilder;
2122
use Psr\Container\ContainerInterface;
2223

@@ -39,11 +40,11 @@ public function __construct(private readonly ContainerInterface $filterLocator)
3940
private function applyFilter(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
4041
{
4142
foreach ($operation?->getParameters() ?? [] as $parameter) {
42-
$values = $this->extractParameterValue($parameter->getValue() ?? []);
43-
if (!$values) {
43+
if (!($v = $parameter->getValue()) || $v instanceof ParameterNotFound) {
4444
continue;
4545
}
4646

47+
$values = $this->extractParameterValue($parameter, $v);
4748
if (null === ($filterId = $parameter->getFilter())) {
4849
continue;
4950
}

src/State/Provider/ParameterProvider.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
6464
}
6565

6666
$parameters->add($parameter->getKey(), $parameter = $parameter->withExtraProperties(
67-
$parameter->getExtraProperties() + ['_api_values' => [$parameter->getKey() => $value]]
67+
$parameter->getExtraProperties() + ['_api_values' => $value]
6868
));
6969

7070
if (null === ($provider = $parameter->getProvider())) {

src/State/Tests/ParameterProviderTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public function has(string $id): bool
5959
$operation = $request->attributes->get('_api_operation');
6060

6161
$this->assertEquals('ok', $operation->getName());
62-
$this->assertEquals(['order' => ['foo' => 'asc']], $operation->getParameters()->get('order', QueryParameter::class)->getValue());
63-
$this->assertEquals(['search[:property]' => ['a' => 'bar']], $operation->getParameters()->get('search[:property]', QueryParameter::class)->getValue());
62+
$this->assertEquals(['foo' => 'asc'], $operation->getParameters()->get('order', QueryParameter::class)->getValue());
63+
$this->assertEquals(['a' => 'bar'], $operation->getParameters()->get('search[:property]', QueryParameter::class)->getValue());
6464
}
6565

6666
public static function provide(): void

src/Symfony/Validator/State/ParameterValidatorProvider.php

+11-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace ApiPlatform\Symfony\Validator\State;
1515

1616
use ApiPlatform\Metadata\Operation;
17+
use ApiPlatform\State\ParameterNotFound;
1718
use ApiPlatform\State\ProviderInterface;
1819
use ApiPlatform\State\Util\ParameterParserTrait;
1920
use ApiPlatform\Validator\Exception\ValidationException;
@@ -39,19 +40,27 @@ public function __construct(
3940

4041
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
4142
{
42-
if (!($request = $context['request']) instanceof Request || false === $operation->getQueryParameterValidationEnabled()) {
43+
if (!($request = $context['request']) instanceof Request) {
4344
return $this->decorated->provide($operation, $uriVariables, $context);
4445
}
4546

4647
$operation = $request->attributes->get('_api_operation') ?? $operation;
48+
if (!($operation->getQueryParameterValidationEnabled() ?? true)) {
49+
return $this->decorated->provide($operation, $uriVariables, $context);
50+
}
51+
4752
$constraintViolationList = new ConstraintViolationList();
4853
foreach ($operation->getParameters() ?? [] as $parameter) {
4954
if (!$constraints = $parameter->getConstraints()) {
5055
continue;
5156
}
5257

5358
$key = $parameter->getKey();
54-
$value = $parameter->getValue()[$key] ?? null;
59+
$value = $parameter->getValue();
60+
if ($value instanceof ParameterNotFound) {
61+
$value = null;
62+
}
63+
5564
$violations = $this->validator->validate($value, $constraints);
5665
foreach ($violations as $violation) {
5766
$constraintViolationList->add(new ConstraintViolation(

tests/Functional/Parameters/ParameterTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ public function testHeaderAndQuery(): void
7575
{
7676
$response = self::createClient()->request('GET', 'with_parameters_header_and_query?q=blabla', ['headers' => ['q' => '(complex stuff)']]);
7777
$this->assertEquals($response->toArray(), [
78-
['q' => ['(complex stuff)']],
79-
['q' => 'blabla'],
78+
['(complex stuff)'],
79+
'blabla',
8080
]);
8181
}
8282
}

0 commit comments

Comments
 (0)