fix(state): avoid deprecated PartialDenormalizationException::getErrors()

This commit is contained in:
dualfroz committed 2026-10-10 11:43:47 +02:00
1 parent b2a14e558d
commit 1da883f931
5 files changed
+46 -21

No files matched your search

+1
View File
@@ -102,6 +102,7 @@ parameters:
- "#Call to function method_exists\\(\\) with 'Symfony\\\\\\\\Component\\\\\\\\Serializer\\\\\\\\Serializer' and 'getSupportedTypes' will always evaluate to true\\.#"
- "#Call to function method_exists\\(\\) with Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface and 'getSupportedTypes' will always evaluate to true\\.#"
- "#Call to function method_exists\\(\\) with Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\ClassMetadata\\|Doctrine\\\\ORM\\\\Mapping\\\\ClassMetadata and 'isChangeTrackingDef…' will always evaluate to true\\.#"
- "#Call to function method_exists\\(\\) with Symfony\\\\Component\\\\Serializer\\\\Exception\\\\PartialDenormalizationException and 'getNotNormalizableV…' will always evaluate to true\\.#"
# See https://github.com/phpstan/phpstan-symfony/issues/27
-
+2 -1
View File
@@ -107,7 +107,8 @@ final class DeserializeProvider implements ProviderInterface, StopwatchAwareInte
}
$violations = new ConstraintViolationList();
foreach ($e->getErrors() as $exception) {
$errors = method_exists($e, 'getNotNormalizableValueErrors') ? $e->getNotNormalizableValueErrors() : $e->getErrors();
foreach ($errors as $exception) {
if (!$exception instanceof NotNormalizableValueException) {
continue;
}
@@ -365,4 +365,47 @@ class DeserializeProviderTest extends TestCase
$request->attributes->set('input_format', 'format');
$provider->provide($operation, ['id' => 1], ['request' => $request]);
}
/**
* @see https://github.com/api-platform/core/issues/8650
*/
public function testDeserializeCollectsPartialDenormalizationErrorsWithoutDeprecation(): void
{
$operation = new Post(deserialize: true, class: \stdClass::class);
$decorated = $this->createStub(ProviderInterface::class);
$decorated->method('provide')->willReturn(null);
$exception = NotNormalizableValueException::createForUnexpectedDataType('Internal error detail', 42, ['string'], 'name', false);
$partialException = new PartialDenormalizationException(null, [$exception]);
$serializerContextBuilder = $this->createStub(SerializerContextBuilderInterface::class);
$serializerContextBuilder->method('createFromRequest')->willReturn([SerializerContextBuilderInterface::ASSIGN_OBJECT_TO_POPULATE => false]);
$serializer = $this->createStub(SerializerInterface::class);
$serializer->method('deserialize')->willThrowException($partialException);
$provider = new DeserializeProvider($decorated, $serializer, $serializerContextBuilder);
$request = new Request(content: '{"name":42}');
$request->headers->set('CONTENT_TYPE', 'application/json');
$request->attributes->set('input_format', 'json');
$deprecations = [];
set_error_handler(static function (int $type, string $message) use (&$deprecations): bool {
$deprecations[] = $message;
return true;
}, \E_USER_DEPRECATED);
try {
$provider->provide($operation, [], ['request' => $request]);
$this->fail('Expected ValidationException');
} catch (ValidationException $e) {
$violations = $e->getConstraintViolationList();
} finally {
restore_error_handler();
}
$this->assertSame([], $deprecations);
$this->assertCount(1, $violations);
$this->assertSame('name', $violations[0]->getPropertyPath());
}
}
@@ -17,8 +17,6 @@ use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\EnumValidationResource;
use ApiPlatform\Tests\SetupClassResourcesTrait;
use Composer\InstalledVersions;
use Composer\Semver\VersionParser;
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
/**
* @see https://github.com/api-platform/core/issues/8183
@@ -67,13 +65,8 @@ final class EnumDenormalizationValidationTest extends ApiTestCase
$this->assertNotNull($genderViolation, 'Expected a constraint violation on "gender" property.');
}
#[IgnoreDeprecations]
public function testInvalidBackedEnumValueWithCollectDenormalizationErrors(): void
{
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
}
$response = static::createClient()->request('POST', '/enum_validation_resources_collect', [
'headers' => ['Content-Type' => 'application/ld+json'],
'json' => ['gender' => 'unknown'],
@@ -87,13 +80,8 @@ final class EnumDenormalizationValidationTest extends ApiTestCase
/**
* @see https://github.com/api-platform/core/issues/8388
*/
#[IgnoreDeprecations]
public function testWrongTypeForBackedEnumReportsAcceptedScalarTypes(): void
{
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
}
$response = static::createClient()->request('POST', '/enum_validation_resources_collect', [
'headers' => ['Content-Type' => 'application/ld+json'],
'json' => ['gender' => true],
@@ -16,9 +16,6 @@ namespace ApiPlatform\Tests\Functional;
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\NullOnNonNullableProperty\NullOnNonNullableResource;
use ApiPlatform\Tests\SetupClassResourcesTrait;
use Composer\InstalledVersions;
use Composer\Semver\VersionParser;
use PHPUnit\Framework\Attributes\IgnoreDeprecations;
/** @see https://github.com/symfony/symfony/issues/64159 */
final class NullOnNonNullablePropertyTest extends ApiTestCase
@@ -48,13 +45,8 @@ final class NullOnNonNullablePropertyTest extends ApiTestCase
$this->assertStringContainsString('Expected argument of type "string", "null" given at property path "name"', $body['hydra:description'] ?? $body['detail'] ?? '');
}
#[IgnoreDeprecations]
public function testNullOnNonNullablePropertyReturns422WhenCollectingErrors(): void
{
if (InstalledVersions::satisfies(new VersionParser(), 'symfony/serializer', '>=8.1')) {
$this->expectUserDeprecationMessage('Since symfony/serializer 8.1: The "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getErrors()" method is deprecated, use "Symfony\Component\Serializer\Exception\PartialDenormalizationException::getNotNormalizableValueErrors()" instead.');
}
$response = self::createClient()->request('POST', '/null_on_non_nullable_resources_collect', [
'headers' => ['Content-Type' => 'application/ld+json'],
'json' => ['name' => null],