php Symfony将CSV数据反序列化为对象数组

yshpjwxd  于 2022-12-02  发布在  PHP
关注(0)|答案(1)|浏览(129)

我有一个php类,其中一个属性使用DateTimeInterface。其他属性是string、int等。
php类

#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $eff_date = null;

在我的控制器中,我处理一些CSV数据来填充类(标题行后面跟着多个数据行)。

$encoders = [new CsvEncoder()];
    $normalizers = [new ObjectNormalizer(), new DateTimeNormalizer()];
    $serializer = new Serializer($normalizers, $encoders);

两个步骤的过程通常有效(单个反序列化步骤无效)
1.解码步骤
1.反规格化步骤

$output = $serializer->decode($data,'csv');
    dump($output);
    
    $an_object_array = [];
    
    foreach($output as $item) { //foreach element in $arr
            $an_object = $serializer->denormalize($item, Rmk::class);
            $an_object_array[] = $an_object;
    }
    
    dd($an_object_array);

如果我将属性设置为字符串,序列化工作正常。
如果没有,我会得到以下错误。
无法对类“App\Entity\Rmk”的属性“EFF_DATE”值进行反规范化:属性路径“EFF_DATE”中给定的参数应为“?DateTimeInterface”类型,“字符串”。

fcg9iug3

fcg9iug31#

找到了解决办法。
1.更改了实体中的setter方法,以接受字符串作为输入,并从该字符串创建日期时间对象。
1.校正规格化器

$normalizers = array(
        new ObjectNormalizer(),
        new ArrayDenormalizer(),
    );

1.也切换到单个反序列化步骤。

$remarks = $serializer->deserialize($data, Rmk::class.'[]','csv');

相关问题