-
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
Closed
Description
Symfony version(s) affected
v7.3.2
Description
serializer for some reason it tries to write to a field with asymmetric visibility protected(set) and serializer starts to crash, although the object is completely filled.
How to reproduce
Code repoduce
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
use Symfony\Component\Serializer\Attribute\DiscriminatorMap;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\UidNormalizer;
use Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer;
use Symfony\Component\Serializer\Serializer;
enum CapsuleItemType: string
{
case FINAL = 'FINAL';
case PROVIDER = 'PROVIDER';
case FINANCIAL = 'FINANCIAL';
case USER_INPUT = 'USER_INPUT';
case MERGED = 'MERGED';
}
final class FinalCapsuleItem
{
public function __construct(
public int $id,
) {
}
}
final class AddFinalCapsuleItemRequest implements AddCapsuleItemRequest
{
protected(set) CapsuleItemType $type;
public function __construct(
public readonly FinalCapsuleItem $item,
) {
$this->type = CapsuleItemType::FINAL;
}
}
final class AddFinancialCapsuleItemRequest implements AddCapsuleItemRequest
{
protected(set) CapsuleItemType $type;
public function __construct(
public readonly FinalCapsuleItem $item,
) {
$this->type = CapsuleItemType::FINAL;
}
}
#[DiscriminatorMap('type', [
CapsuleItemType::FINAL->value => AddFinalCapsuleItemRequest::class,
CapsuleItemType::FINANCIAL->value => AddFinancialCapsuleItemRequest::class,
])]
interface AddCapsuleItemRequest
{
protected(set) CapsuleItemType $type {get;set;}
}
$classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());
$objectNormalizer = new ObjectNormalizer(
$classMetadataFactory,
new MetadataAwareNameConverter($classMetadataFactory),
null,
new PropertyInfoExtractor(
[],
[new PhpStanExtractor()],
[],
[],
[]
),
new ClassDiscriminatorFromClassMetadata($classMetadataFactory),
);
$serializer =
new Serializer([
new UnwrappingDenormalizer,
new UidNormalizer,
new DateTimeNormalizer,
new DateIntervalNormalizer,
$objectNormalizer,
new ArrayDenormalizer], [new JsonEncoder]
);
$json = <<<JSON
{
"type": "FINAL",
"item": {
"id": 1
}
}
JSON;
dd(
$serializer->deserialize($json, AddCapsuleItemRequest::class, 'json'),
);Possible Solution
No response
Additional Context
No response
santysisi