如果您的示例数组是输入,那么您需要一个单独的去规范化器来满足您的需求。
我的日期时间类型
要识别属性,请创建自己的类型。此类型继承\DateTime。
namespace App\Normalizer;
class MyDateTimeType extends \DateTime { }
历史
class Historique
{
public MyDateTimeType $createdAt;
public function __construct(public readonly string $utilisateur, public readonly string $type, public readonly ?string $texte)
{
$this->createdAt = new MyDateTimeType();
}
public function getTypeLabel(): string
{
return $this->type;
}
}
MyDateTimeTypeDenormalizer
DateTimeNormalizer是为规范化进程继承的。
namespace App\Normalizer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class MyDateTimeTypeDenormalizer extends DateTimeNormalizer implements DenormalizerInterface
{
public function denormalize(mixed $data, string $type, string $format = null, array $context = []): \DateTimeInterface
{
return new MyDateTimeType($data['date'], new \DateTimeZone($data['timezone']));
}
public function supportsDenormalization(mixed $data, string $type, string $format = null): bool
{
return MyDateTimeType::class === $type;
}
}
示例+测试
use App\Normalizer\Historique;
use App\Normalizer\MyDateTimeTypeDenormalizer;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class HistoriqueTest extends KernelTestCase
{
public function testHistorique()
{
$historique = [
"createdAt" => [
"date" => "2024-01-09 17:04:37.209330",
"timezone_type" => 3,
"timezone" => "Europe/Paris"
],
"utilisateur" => "phpunit",
"type" => "CREATION",
"texte" => "creation de la demande"
];
$normalizers = [
new MyDateTimeTypeDenormalizer(),
new ObjectNormalizer(
new ClassMetadataFactory(new AnnotationLoader(null)),
null,
null,
new ReflectionExtractor()
),
new BackedEnumNormalizer()
];
$serializer = new Serializer($normalizers, [new JsonEncoder()]);
$result = $serializer->denormalize(
$historique,
Historique::class,
'json',
[DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s']
);
$this->assertSame('2024-01-09T17:04:37+01:00', $result->createdAt->format('c'));
}
}