转换器创建的Api平台DTO对象无法持久保存

时间:2019-03-06 13:11:55

标签: api-platform.com

使用Api平台,我在使用输入类及其转换时遇到问题。

已遵循以下文档。 https://api-platform.com/docs/core/dto/#using-data-transfer-objects-dtos

在Data Transformer服务执行转换并返回正确类的对象之后,由api平台拾取的对象似乎为空,因此它要么无法通过验证(如果存在验证),要么无法持久化数据库-由于其字段似乎为空。

这是DataTransformer服务方法的简化代码-它产生具有硬编码值的对象:

public function transform($object, string $to, array $context = [])
{
    $newCreativeElement = new CreativeElement();
    $newCreativeElement->setKeyName("HARDCODED VALUE");
    $newCreativeElement->setIntValue(42);
    return $newCreativeElement;
}

public function supportsTransformation($object, string $to, array $context = []): bool
{
    if ($object instanceof CreativeElement){
        return false;
    }
    $result = CreativeElement::class === $to && null !== ($context['input']['class'] ?? null);
    return $result;
}

1 个答案:

答案 0 :(得分:0)

编辑: 由2.4版本解决。 升级您的composer.json并享受。

我有同样的问题。 我尝试过的是返回数组而不是对象转换方法。它正在工作,但不是真正的解决方案。

似乎两次调用了非规范化器:一次用于您的转换器,然后通过AbstractItemNormalizer将“ CreativeElement”转换为“ CreativeElement”


        $context['api_denormalize'] = true;
        $context['resource_class'] = $class;
        $inputClass = $this->getInputClass($class, $context);

        if (null !== $inputClass && null !== $dataTransformer = $this->getDataTransformer($data, $class, $context)) {
            $data = $dataTransformer->transform(
                parent::denormalize($data, $inputClass, $format, ['resource_class' => $inputClass] + $context),
                $class,
                $context
            );
        }

        return parent::denormalize($data, $class, $format, $context);

也在寻找解决方案