首页 > 解决方案 > API 平台:规范化映射超类仅包括来自超类的属性,不包括子类

问题描述

编辑:用一个简单的用例创建了一个 repo 来复制问题,并在https://github.com/api-platform/api-platform/issues/1648的 API 平台问题队列中创建了一个问题。

我有一个SurveyData映射的超类,它有多个实现它的子类。对于这个问题,MonthlyDataSurveyData超类的孩子。

我有Submission一个OneToOneSurveyData.

当我检索它时,我试图将SurveyData子实体(在本例中为MonthlyData实体)内联到我的提交实体中。我已经normalizationContext在我SubmissionApiResource注释中设置了 ,并@Groups在我想要内联的各种属性上设置了注释。

它主要是有效的,因为除了和JSON-LD 属性之外,我的SurveyData映射超类的属性内联显示在我的实体中。但是,实际子实体 ( )的属性不会出现。Submission@id@typeMonthlyTotals

我可以确认传递给规范器的对象是一个完全填充的MonthlyTotals对象,但规范器的输出仅包含SurveyData映射超类中定义的属性。

我可以确认我正在使用默认的核心 API 平台 JSON-LD 规范器。

预先感谢您的任何帮助!

这是一个Submission定义(为简洁起见,减去'use'语句和getter / setter:

<?php
/**
 * @ApiResource(
 *   normalizationContext={"groups"={"submission"}},
 *   denormalizationContext={"groups"={"submission"}},
 *   itemOperations={
 *     "get"={
 *       "method"="GET",
 *       "access_control"="is_granted('view', object)",
 *     },
 *     "put", "patch", "delete",
 *   },
 * )
 *
 * @ApiFilter(NumericFilter::class, properties={"patient.id"})
 * @ApiFilter(OrderFilter::class, properties={"created", "status", "patient.chartID"}, arguments={"orderParameterName"="order"})
 * @ApiFilter(SearchFilter::class, properties={"status": "exact", "patient.chartID": "exact"})
 * @ORM\Entity(repositoryClass="App\Repository\SubmissionRepository")
 * @DelphiAssert\SubmissionDataIsValid
 */
class Submission
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups({"submission"})
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Facility")
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"submission"})
     */
    private $facility;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Patient", inversedBy="submissions")
     * @Groups({"submission"})
     */
    private $patient;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $survey;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Groups({"submission"})
     */
    private $dateDetail;

    /**
     * @ORM\Column(type="datetime")
     * @Assert\Type("\DateTimeInterface")
     * @Groups({"submission"})
     */
    private $created;

    /**
     * @ORM\Column(type="datetime")
     * @Assert\Type("\DateTimeInterface")
     * @Groups({"submission"})
     */
    private $updated;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $user;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $status;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\SurveyData\SurveyData", inversedBy="submission", cascade={"persist", "remove"}, orphanRemoval=true, fetch="EAGER")
     * @Groups({"submission"})
     */
    private $surveyData;

这是 SurveyData(相同条件):

<?php
/**
 * @ORM\Entity(repositoryClass="App\Repository\SurveyData\SurveyDataRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *   "SurveyData" = "App\Entity\SurveyData\SurveyData",
 *   "RPCSEducationProcessMeasures" = "App\Entity\SurveyData\RPCS\EducationProcessMeasures",
 *   "RPCSMonthlyTotals" = "App\Entity\SurveyData\RPCS\MonthlyTotals"
 * })
 */
class SurveyData
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups("submission")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Submission", mappedBy="surveyData", cascade={"persist", "remove"}, fetch="EAGER")
     */
    private $submission;

这是每月数据:

/**
 * @ApiResource(
 *   normalizationContext={"groups"={"submission"}},
 *   denormalizationContext={"groups"={"submission"}}
 * )
 * @ORM\Entity(repositoryClass="App\Repository\SurveyData\RPCS\MonthlyTotalsRepository")
 */
class MonthlyTotals extends SurveyData
{

    /**
     * @ORM\Column(type="integer")
     * @Groups("submission")
     */
    private $num_deliveries;

    /**
     * @ORM\Column(type="integer")
     * @Groups("submission")
     */
    private $num_cesarean;

    /**
     * @ORM\Column(type="integer")
     * @Groups("submission")
     */
    private $num_epidural_anesthesia;

标签: phpsymfonydoctrine-ormdoctrineapi-platform.com

解决方案


可能是@Groups({"submission"})@Groups("submission")。。全部更改为@Groups({"submission"}).

很难用当前文档进行验证,因为它现在使用 PHP8 属性进行了记录。我只使用了 YAML 配置,所以不能 100% 确定。


推荐阅读