diff --git a/src/FormHydrator.php b/src/FormHydrator.php index 9a5a222..b3188ad 100644 --- a/src/FormHydrator.php +++ b/src/FormHydrator.php @@ -52,15 +52,11 @@ public function __construct( */ public function populate( FormModelInterface $model, - mixed $data, + array $data, ?array $map = null, ?bool $strict = null, ?string $scope = null ): bool { - if (!is_array($data)) { - return false; - } - $scope ??= $model->getFormName(); if ($scope === '') { $hydrateData = $data; @@ -152,7 +148,13 @@ public function populateFromPost( return false; } - return $this->populate($model, $request->getParsedBody(), $map, $strict, $scope); + return $this->populate( + $model, + array_merge($request->getParsedBody(), $request->getUploadedFiles()), + $map, + $strict, + $scope + ); } /** @@ -179,11 +181,11 @@ public function populateFromPostAndValidate( ?bool $strict = null, ?string $scope = null ): bool { - if ($request->getMethod() !== 'POST') { + if (!$this->populateFromPost($model, $request, $map, $strict, $scope)) { return false; } - return $this->populateAndValidate($model, $request->getParsedBody(), $map, $strict, $scope); + return $this->validate($model)->isValid(); } /** diff --git a/tests/FormHydratorTest.php b/tests/FormHydratorTest.php index c357589..1e325cd 100644 --- a/tests/FormHydratorTest.php +++ b/tests/FormHydratorTest.php @@ -5,11 +5,15 @@ namespace Yiisoft\FormModel\Tests; use HttpSoft\Message\ServerRequestFactory; +use HttpSoft\Message\StreamFactory; +use HttpSoft\Message\UploadedFile; +use HttpSoft\Message\UploadedFileFactory; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Psr\Http\Message\ServerRequestInterface; use Yiisoft\FormModel\FormModel; use Yiisoft\FormModel\Tests\Support\Form\CarForm; +use Yiisoft\FormModel\Tests\Support\Form\UploadedFileForm; use Yiisoft\FormModel\Tests\Support\TestHelper; use Yiisoft\Validator\Result; use Yiisoft\Validator\Rule\Integer; @@ -180,4 +184,25 @@ public function getRules(): iterable $this->assertSame('developer', $form->job); $this->assertSame('', $form->tip); } + + public function testUploadedFile(): void + { + $stream = (new StreamFactory()) + ->createStreamFromFile('./Support/Dto/Coordinates.php') + ; + $uploadedFile = (new UploadedFileFactory()) + ->createUploadedFile($stream) + ; + $request = (new ServerRequestFactory()) + ->createServerRequest('POST', '/') + ->withUploadedFiles([$uploadedFile]) + ; + + $form = new UploadedFileForm(); + + $result = TestHelper::createFormHydrator()->populateFromPostAndValidate($form, $request); + + $this->assertTrue($result); + $this->assertInstanceOf(UploadedFile::class, $form->file); + } } diff --git a/tests/Support/Form/UploadedFileForm.php b/tests/Support/Form/UploadedFileForm.php new file mode 100644 index 0000000..b215b18 --- /dev/null +++ b/tests/Support/Form/UploadedFileForm.php @@ -0,0 +1,23 @@ + [new Required()], + ]; + } +}