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对应的序列化组读取到,具体修改如下:
- 更新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;
- 将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;
- (可选)仅返回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
相关产品推荐
相关产品推荐

