Skip to content

Commit 0d68488

Browse files
Merge branch '6.4' into 7.0
* 6.4: (33 commits) [Console][FrameworkBundle][HttpKernel][WebProfilerBundle] Enable profiling commands [AssetMapper] Disable profiler when the "dev server" respond Adds translations for Portuguese (pt) [AssetMapper] Link needs as="style" Allow Symfony 7.0 on Phrase translation provider [Mime] Throw InvalidArgumentException on invalid form field type inside array [Mailer][Bridges] Allow Symfony 7 [Tests] Use `JsonMockResponse` where applicable [FrameworkBundle][HttpKernel] Introduce `$buildDir` argument to `WarmableInterface::warmup` to warm read-only artefacts in `build_dir` [ErrorHandler] Fix expected missing return types [Form] Fix merging params & files when "multiple" is enabled [HttpFoundation] Do not swallow trailing `=` in cookie value Fix markdown in README files Handle Sendinblue error responses without a message key Handle Brevo error responses without a message key [Scheduler] Add failureEvent [Notifier][Bridges] Allow Symfony 7 [Mailer][Brevo][Sendinblue] Fix typo [Serializer] Fix collecting only first missing constructor argument [ErrorHandler] Fix file link format call in trace view ...
2 parents 55035e2 + e1ccd76 commit 0d68488

File tree

7 files changed

+71
-10
lines changed

7 files changed

+71
-10
lines changed

Command/DebugCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
use Symfony\Component\Console\Input\InputOption;
2222
use Symfony\Component\Console\Output\OutputInterface;
2323
use Symfony\Component\Console\Style\SymfonyStyle;
24+
use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
2425
use Symfony\Component\Form\Console\Helper\DescriptorHelper;
2526
use Symfony\Component\Form\Extension\Core\CoreExtension;
2627
use Symfony\Component\Form\FormRegistryInterface;
2728
use Symfony\Component\Form\FormTypeInterface;
28-
use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
2929

3030
/**
3131
* A console command for retrieving information about form types.

Console/Descriptor/TextDescriptor.php

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

1414
use Symfony\Component\Console\Helper\Dumper;
1515
use Symfony\Component\Console\Helper\TableSeparator;
16+
use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
1617
use Symfony\Component\Form\ResolvedFormTypeInterface;
17-
use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
1818
use Symfony\Component\OptionsResolver\OptionsResolver;
1919

2020
/**
@@ -24,11 +24,9 @@
2424
*/
2525
class TextDescriptor extends Descriptor
2626
{
27-
private ?FileLinkFormatter $fileLinkFormatter;
28-
29-
public function __construct(FileLinkFormatter $fileLinkFormatter = null)
30-
{
31-
$this->fileLinkFormatter = $fileLinkFormatter;
27+
public function __construct(
28+
private readonly ?FileLinkFormatter $fileLinkFormatter = null,
29+
) {
3230
}
3331

3432
protected function describeDefaults(array $options): void

Console/Helper/DescriptorHelper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
namespace Symfony\Component\Form\Console\Helper;
1313

1414
use Symfony\Component\Console\Helper\DescriptorHelper as BaseDescriptorHelper;
15+
use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
1516
use Symfony\Component\Form\Console\Descriptor\JsonDescriptor;
1617
use Symfony\Component\Form\Console\Descriptor\TextDescriptor;
17-
use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
1818

1919
/**
2020
* @author Yonel Ceruto <[email protected]>

Extension/HttpFoundation/HttpFoundationRequestHandler.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Form\FormError;
1616
use Symfony\Component\Form\FormInterface;
1717
use Symfony\Component\Form\RequestHandlerInterface;
18+
use Symfony\Component\Form\Util\FormUtil;
1819
use Symfony\Component\Form\Util\ServerParams;
1920
use Symfony\Component\HttpFoundation\File\File;
2021
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -92,7 +93,7 @@ public function handleRequest(FormInterface $form, mixed $request = null): void
9293
}
9394

9495
if (\is_array($params) && \is_array($files)) {
95-
$data = array_replace_recursive($params, $files);
96+
$data = FormUtil::mergeParamsAndFiles($params, $files);
9697
} else {
9798
$data = $params ?: $files;
9899
}

NativeRequestHandler.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Form;
1313

1414
use Symfony\Component\Form\Exception\UnexpectedTypeException;
15+
use Symfony\Component\Form\Util\FormUtil;
1516
use Symfony\Component\Form\Util\ServerParams;
1617

1718
/**
@@ -104,7 +105,7 @@ public function handleRequest(FormInterface $form, mixed $request = null): void
104105
}
105106

106107
if (\is_array($params) && \is_array($files)) {
107-
$data = array_replace_recursive($params, $files);
108+
$data = FormUtil::mergeParamsAndFiles($params, $files);
108109
} else {
109110
$data = $params ?: $files;
110111
}

Tests/AbstractRequestHandlerTestCase.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,42 @@ public function testMergeParamsAndFiles($method)
227227
$this->assertSame($file, $form->get('field2')->getData());
228228
}
229229

230+
/**
231+
* @dataProvider methodExceptGetProvider
232+
*/
233+
public function testMergeParamsAndFilesMultiple($method)
234+
{
235+
$form = $this->createForm('param1', $method, true);
236+
$form->add($this->createBuilder('field1', false, ['allow_file_upload' => true, 'multiple' => true])->getForm());
237+
$file1 = $this->getUploadedFile();
238+
$file2 = $this->getUploadedFile();
239+
240+
$this->setRequestData($method, [
241+
'param1' => [
242+
'field1' => [
243+
'foo',
244+
'bar',
245+
'baz',
246+
],
247+
],
248+
], [
249+
'param1' => [
250+
'field1' => [
251+
$file1,
252+
$file2,
253+
],
254+
],
255+
]);
256+
257+
$this->requestHandler->handleRequest($form, $this->request);
258+
$data = $form->get('field1')->getData();
259+
260+
$this->assertTrue($form->isSubmitted());
261+
$this->assertIsArray($data);
262+
$this->assertCount(5, $data);
263+
$this->assertSame(['foo', 'bar', 'baz', $file1, $file2], $data);
264+
}
265+
230266
/**
231267
* @dataProvider methodExceptGetProvider
232268
*/

Util/FormUtil.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,29 @@ public static function isEmpty(mixed $data): bool
3737
// not considered to be empty, ever.
3838
return null === $data || '' === $data;
3939
}
40+
41+
/**
42+
* Recursively replaces or appends elements of the first array with elements
43+
* of second array. If the key is an integer, the values will be appended to
44+
* the new array; otherwise, the value from the second array will replace
45+
* the one from the first array.
46+
*/
47+
public static function mergeParamsAndFiles(array $params, array $files): array
48+
{
49+
$result = [];
50+
51+
foreach ($params as $key => $value) {
52+
if (\is_array($value) && \is_array($files[$key] ?? null)) {
53+
$value = self::mergeParamsAndFiles($value, $files[$key]);
54+
unset($files[$key]);
55+
}
56+
if (\is_int($key)) {
57+
$result[] = $value;
58+
} else {
59+
$result[$key] = $value;
60+
}
61+
}
62+
63+
return array_merge($result, $files);
64+
}
4065
}

0 commit comments

Comments
 (0)