Skip to content

Commit 79ddd57

Browse files
[HttpKernel] Fix variadic argument handling with #[MapUploadedFile]
1 parent afbb15d commit 79ddd57

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

Controller/ArgumentResolver/RequestPayloadValueResolver.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ public function onKernelControllerArguments(ControllerArgumentsEvent $event): vo
161161
}
162162
}
163163

164+
if ($argument->metadata->isVariadic()) {
165+
array_splice($arguments, $i, 1, $payload ?? []);
166+
continue;
167+
}
168+
164169
if (null === $payload) {
165170
$payload = match (true) {
166171
$argument->metadata->hasDefaultValue() => $argument->metadata->getDefaultValue(),
@@ -233,7 +238,7 @@ private function mapRequestPayload(Request $request, ArgumentMetadata $argument,
233238
private function mapUploadedFile(Request $request, ArgumentMetadata $argument, MapUploadedFile $attribute): UploadedFile|array|null
234239
{
235240
if ($files = $request->files->get($attribute->name ?? $argument->getName())) {
236-
return $files;
241+
return !\is_array($files) && $argument->isVariadic() ? [$files] : $files;
237242
}
238243

239244
if ($argument->isNullable() || $argument->hasDefaultValue()) {

Tests/Controller/ArgumentResolver/UploadedFileValueResolverTest.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,36 @@ static function () {},
296296
$resolver->onKernelControllerArguments($event);
297297
}
298298

299+
#[DataProvider('provideContext')]
300+
public function testSingleFileVariadic(RequestPayloadValueResolver $resolver, Request $request)
301+
{
302+
$attribute = new MapUploadedFile();
303+
$argument = new ArgumentMetadata(
304+
'foo',
305+
UploadedFile::class,
306+
true,
307+
false,
308+
null,
309+
false,
310+
[$attribute::class => $attribute]
311+
);
312+
$event = new ControllerArgumentsEvent(
313+
$this->createStub(HttpKernelInterface::class),
314+
static function () {},
315+
$resolver->resolve($request, $argument),
316+
$request,
317+
HttpKernelInterface::MAIN_REQUEST
318+
);
319+
$resolver->onKernelControllerArguments($event);
320+
321+
/** @var UploadedFile[] $data */
322+
$data = $event->getArguments();
323+
324+
$this->assertCount(1, $data);
325+
$this->assertSame('file-small.txt', $data[0]->getFilename());
326+
$this->assertSame(36, $data[0]->getSize());
327+
}
328+
299329
#[DataProvider('provideContext')]
300330
public function testMultipleFilesVariadic(RequestPayloadValueResolver $resolver, Request $request)
301331
{
@@ -319,7 +349,7 @@ static function () {},
319349
$resolver->onKernelControllerArguments($event);
320350

321351
/** @var UploadedFile[] $data */
322-
$data = $event->getArguments()[0];
352+
$data = $event->getArguments();
323353

324354
$this->assertCount(2, $data);
325355
$this->assertSame('file-small.txt', $data[0]->getFilename());

0 commit comments

Comments
 (0)