You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API Platform序列化问题:获取Parameter关联Queue名称而非IRI

API Platform序列化问题:获取关联实体Queue的名称而非IRI

我是API Platform的新手,目前遇到序列化相关问题(官方文档未能提供有效帮助)。我有Queue和Parameter两个关联实体表,当发送GET请求获取Parameter数据时,得到的是Queue的IRI(如/api/queues/1)而非实际名称,推测是代码中的序列化配置缺失导致。我使用了#[Groups]属性,以下是我的代码:

Parameter.php

class Parameter
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $id = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    
    private ?Cluster $cluster = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['group:read:collection', 'group:read:item'])]
    private ?Queue $queue = null;

    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $nbClients = null;

    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $nbProcess = null;

    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $nbThreads = null;

    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $nbCluster = null;

    #[ORM\Column]
    #[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
    private ?int $nbClusterPerNode = null;

    #[ORM\ManyToOne(inversedBy: 'parameter')]
    #[ORM\JoinColumn(nullable: false)]
    private ?Software $software = null;
}

Queue.php

#[ApiResource]
#[ORM\Entity(repositoryClass: QueueRepository::class)]
class Queue
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['parameter'])]
    private ?int $id = null;

    #[ORM\ManyToOne(inversedBy: 'queues')]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['group:read:item'])]
    private ?Cluster $cluster = null;

    #[ORM\Column(length: 255)]
    #[Groups(['group:read:collection', 'group:read:item'])]
    private ?string $name = null;

    #[ORM\Column(nullable: true)]
    private ?int $rack = null;

    #[ORM\OneToMany(mappedBy: 'queue', targetEntity: Group::class, orphanRemoval: true)]
    private Collection $groups;

    #[ORM\Column(nullable: true)]
    #[Groups(['cluster:read:collection', 'job:read:collection'])]
    private ?bool $available = null;
}

解决方案

要让Parameter返回Queue的名称而非IRI,核心是确保序列化组匹配,让Queue的name字段能被Parameter对应的序列化组读取到,具体修改如下:

  1. 更新Parameter实体中queue字段的序列化组
    当前Parameter的queue字段仅关联了group:read:collection和group:read:item组,但你获取Parameter时使用的是其他组(如cluster:read:collection、job:read:collection等),这些组未包含queue字段。修改queue的#[Groups],加入你获取Parameter时用到的所有序列化组:
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
#[Groups(['cluster:read:collection', 'read:Job', 'job:read:collection', 'cluster:readAllJobs:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item', 'group:read:collection', 'group:read:item'])]
private ?Queue $queue = null;
  1. 将Queue实体的name字段加入Parameter使用的序列化组
    修改Queue.php中name字段的#[Groups],加入Parameter读取时用到的组,确保序列化器能读取到name字段:
#[ORM\Column(length: 255)]
#[Groups(['group:read:collection', 'group:read:item', 'cluster:read:collection', 'job:read:collection', 'workflow:read:item', 'software:read:collection', 'software:read:item'])]
private ?string $name = null;
  1. (可选)仅返回Queue的name而非完整实体
    如果不想返回Queue的其他字段,可单独定义一个序列化组,比如queue:read,然后在Parameter的queue字段上指定序列化上下文:
// Parameter.php
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
#[Groups(['cluster:read:collection', ...])] // 保留原有的组
#[Serializer\Context(groups: ['queue:read'])]
private ?Queue $queue = null;
// Queue.php
#[ORM\Column(length: 255)]
#[Groups(['group:read:collection', 'group:read:item', 'queue:read'])]
private ?string $name = null;

完成以上配置后,再次发送GET请求获取Parameter数据时,序列化器会返回Queue的name字段值,而不是IRI。


内容的提问来源于stack exchange,提问作者Docrom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:33:10