13
13
14
14
namespace ApiPlatform \State \Provider ;
15
15
16
- use ApiPlatform \Metadata \HeaderParameterInterface ;
17
16
use ApiPlatform \Metadata \Operation ;
18
17
use ApiPlatform \Metadata \Parameter ;
19
18
use ApiPlatform \Metadata \Parameters ;
20
19
use ApiPlatform \State \Exception \ProviderNotFoundException ;
21
20
use ApiPlatform \State \ParameterProviderInterface ;
22
21
use ApiPlatform \State \ProviderInterface ;
22
+ use ApiPlatform \State \Util \ParameterParserTrait ;
23
23
use ApiPlatform \State \Util \RequestParser ;
24
24
use Psr \Container \ContainerInterface ;
25
- use Symfony \Component \HttpFoundation \Request ;
26
25
27
26
/**
28
27
* Loops over parameters to:
33
32
*/
34
33
final class ParameterProvider implements ProviderInterface
35
34
{
35
+ use ParameterParserTrait;
36
+
36
37
public function __construct (private readonly ?ProviderInterface $ decorated = null , private readonly ?ContainerInterface $ locator = null )
37
38
{
38
39
}
@@ -50,31 +51,27 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
50
51
}
51
52
52
53
$ context = ['operation ' => $ operation ] + $ context ;
53
- $ parameters = $ operation ->getParameters () ?? [];
54
- $ operationParameters = $ parameters instanceof Parameters ? iterator_to_array ($ parameters ) : $ parameters ;
55
- foreach ($ operationParameters as $ parameter ) {
54
+ $ p = $ operation ->getParameters () ?? [];
55
+ $ parameters = $ p instanceof Parameters ? iterator_to_array ($ p ) : $ p ;
56
+ foreach ($ parameters as $ parameter ) {
56
57
$ key = $ parameter ->getKey ();
57
- $ parameters = $ this ->extractParameterValues ($ parameter , $ request , $ context );
58
- $ parsedKey = explode ('[:property] ' , $ key );
59
-
60
- if (isset ($ parsedKey [0 ]) && isset ($ parameters [$ parsedKey [0 ]])) {
61
- $ key = $ parsedKey [0 ];
62
- }
58
+ $ values = $ this ->extractParameterValues ($ parameter , $ request , $ context );
59
+ $ key = $ this ->getParameterFlattenKey ($ key , $ values );
63
60
64
- if (!isset ($ parameters [$ key ])) {
61
+ if (!isset ($ values [$ key ])) {
65
62
continue ;
66
63
}
67
64
68
- $ operationParameters [$ parameter ->getKey ()] = $ parameter = $ parameter ->withExtraProperties (
69
- $ parameter ->getExtraProperties () + ['_api_values ' => [$ key => $ parameters [$ key ]]]
65
+ $ parameters [$ parameter ->getKey ()] = $ parameter = $ parameter ->withExtraProperties (
66
+ $ parameter ->getExtraProperties () + ['_api_values ' => [$ key => $ values [$ key ]]]
70
67
);
71
68
72
69
if (null === ($ provider = $ parameter ->getProvider ())) {
73
70
continue ;
74
71
}
75
72
76
73
if (\is_callable ($ provider )) {
77
- if (($ op = $ provider ($ parameter , $ parameters , $ context )) instanceof Operation) {
74
+ if (($ op = $ provider ($ parameter , $ values , $ context )) instanceof Operation) {
78
75
$ operation = $ op ;
79
76
}
80
77
@@ -87,28 +84,15 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
87
84
88
85
/** @var ParameterProviderInterface $providerInstance */
89
86
$ providerInstance = $ this ->locator ->get ($ provider );
90
- if (($ op = $ providerInstance ->provide ($ parameter , $ parameters , $ context )) instanceof Operation) {
87
+ if (($ op = $ providerInstance ->provide ($ parameter , $ values , $ context )) instanceof Operation) {
91
88
$ operation = $ op ;
92
89
}
93
90
}
94
91
95
- $ operation = $ operation ->withParameters (new Parameters ($ operationParameters ));
92
+ $ operation = $ operation ->withParameters (new Parameters ($ parameters ));
96
93
$ request ?->attributes->set ('_api_operation ' , $ operation );
97
94
$ context ['operation ' ] = $ operation ;
98
95
99
96
return $ this ->decorated ?->provide($ operation , $ uriVariables , $ context );
100
97
}
101
-
102
- /**
103
- * @param array<string, mixed> $context
104
- */
105
- private function extractParameterValues (Parameter $ parameter , ?Request $ request , array $ context )
106
- {
107
- if ($ request ) {
108
- return $ parameter instanceof HeaderParameterInterface ? $ request ->attributes ->get ('_api_header_parameters ' ) : $ request ->attributes ->get ('_api_query_parameters ' );
109
- }
110
-
111
- // GraphQl
112
- return $ context ['args ' ] ?? [];
113
- }
114
98
}
0 commit comments