@@ -26,10 +26,10 @@ public function process(Request $request, callable $handler)
2626 return $ handler ($ request );
2727 }
2828
29- $ data = $ this ->getRequestData ($ request );
29+ $ defaultData = $ this ->getRequestData ($ request );
3030
31- $ this ->handleMethodValidation ($ metadata ['methods ' ], $ data );
32- $ this ->handleParamValidation ($ metadata ['params ' ], $ data );
31+ $ this ->handleMethodValidation ($ request , $ metadata ['methods ' ], $ defaultData );
32+ $ this ->handleParamValidation ($ request , $ metadata ['params ' ], $ defaultData );
3333
3434 return $ handler ($ request );
3535 }
@@ -46,18 +46,19 @@ private function resolveMetadata(Request $request): ?array
4646 return $ this ->getCallableMetadata ($ request );
4747 }
4848
49- private function handleMethodValidation (array $ methods , array $ data ): void
49+ private function handleMethodValidation (Request $ request , array $ methods , array $ defaultData ): void
5050 {
5151 if ($ methods === []) {
5252 return ;
5353 }
5454
5555 foreach ($ methods as $ config ) {
56+ $ data = $ this ->resolveRequestData ($ request , $ config ->in , $ defaultData );
5657 $ this ->validateMethod ($ config , $ data );
5758 }
5859 }
5960
60- private function handleParamValidation (array $ params , array $ data ): void
61+ private function handleParamValidation (Request $ request , array $ params , array $ defaultData ): void
6162 {
6263 if ($ params === []) {
6364 return ;
@@ -73,7 +74,8 @@ private function handleParamValidation(array $params, array $data): void
7374 /** @var \Webman\Validation\Annotation\Param $config */
7475 $ config = $ item ['config ' ];
7576
76- $ value = $ data [$ name ] ?? null ;
77+ $ dataForParam = $ this ->resolveRequestData ($ request , $ config ->in , $ defaultData );
78+ $ value = $ dataForParam [$ name ] ?? null ;
7779 if ($ value === null && $ item ['hasDefault ' ]) {
7880 $ value = $ item ['default ' ];
7981 }
@@ -135,6 +137,40 @@ private function getRequestData(Request $request): array
135137 return array_merge ($ request ->all () ?: [], $ routeParams );
136138 }
137139
140+ private function resolveRequestData (Request $ request , string |array |null $ in , array $ defaultData ): array
141+ {
142+ if ($ in === null || $ in === []) {
143+ return $ defaultData ;
144+ }
145+
146+ $ parts = is_array ($ in ) ? $ in : [$ in ];
147+ $ data = [];
148+ foreach ($ parts as $ part ) {
149+ $ data = array_merge ($ data , $ this ->getRequestPartData ($ request , $ part ));
150+ }
151+ return $ data ;
152+ }
153+
154+ private function getRequestPartData (Request $ request , mixed $ part ): array
155+ {
156+ if (!is_string ($ part ) || $ part === '' ) {
157+ throw new InvalidArgumentException ('Validate/Param in must be a non-empty string or string array. ' );
158+ }
159+
160+ return match ($ part ) {
161+ 'query ' => $ request ->get () ?: [],
162+ 'body ' => $ request ->post () ?: [],
163+ 'path ' => $ this ->getPathParams ($ request ),
164+ default => throw new InvalidArgumentException ("Unsupported in value: {$ part }. Only query|body|path are supported. " ),
165+ };
166+ }
167+
168+ private function getPathParams (Request $ request ): array
169+ {
170+ $ routeParams = $ request ->route ? $ request ->route ->param () : [];
171+ return is_array ($ routeParams ) ? $ routeParams : [];
172+ }
173+
138174 private function getMethodMetadata (string $ controller , string $ action ): ?array
139175 {
140176 $ key = $ controller . ':: ' . $ action ;
@@ -251,7 +287,8 @@ private function resolveParamConfig(ReflectionParameter $parameter, bool $inferW
251287 return new Param (
252288 rules: $ completedRules ,
253289 messages: $ config ->messages ,
254- attribute: $ config ->attribute
290+ attribute: $ config ->attribute ,
291+ in: $ config ->in
255292 );
256293 }
257294
0 commit comments