猿问

Symfony 5 API 填充相关对象实体

我正在尝试使用 Symfony 5 创建一个简单的网络应用程序。我正在使用API。

目前,当调用某个端点时,它仅显示相关链接的 IRI 链接:

我需要显示相关实体对象本身;如果我得到Item端点,相关实体Program应该返回:

{

    "id": 1,

    "program": {

        "id": 1,

        "name": "First program"

    },

    "description": "fgdfg",

    "comment": "dfgdfg"

{

因此,该表的外观如下:




我认为设置子资源就足以获取对象,但事实并非如此:


在InventoryItem实体配置属性@ApiSubresource的注解中Program:


/**

 * @ORM\ManyToOne(targetEntity=Program::class, inversedBy="inventoryItems")

 * @ORM\JoinColumn(nullable=false)

 * @ApiSubresource

 */

private $program;

在resources.yaml文件中我配置了子资源:


App\Entity\InventoryItem:

   properties:

       program:

           subresource:

               resourceClass: 'App\Entity\Program'

               collection: true

这仍然返回 IRI 而不是对象,唯一改变的是现在我可以访问此 URL 中当前对象的相关实体:http://localhost:8000/api/inventory_items/1/program.json。


关于如何返回相关实体对象本身而不是 IRI URL 有什么想法吗?


达令说
浏览 113回答 1
1回答

蛊毒传说

您正在搜索序列化您的商品。所以我想这更多的是序列化问题而不是子资源问题。我认为你应该使用序列化组而不是子资源。SOLUTION1序列化嵌入关系“嵌入关系”提供了书籍和作者的示例。<?php// api/src/Entity/Item.phpnamespace App\Entity;use ApiPlatform\Core\Annotation\ApiResource;use Symfony\Component\Serializer\Annotation\Groups;/** * @ApiResource(normalizationContext={"groups"={"item"}}) */class Item{    /**     * @Groups({"item"})     */    public $description;    /**     * @Groups({"item"})     */    public $comment;    /**     * @Groups({"item"})     */    public $program;    // ...}// api/src/Entity/Person.phpnamespace App\Entity;use ApiPlatform\Core\Annotation\ApiResource;use Symfony\Component\Serializer\Annotation\Groups;/** * @ApiResource */class Person{    /**     * ...     * @Groups("item") <=== This is item, not program but you can have two groups     */    public $name;    // ...}SOLUTION2混合子资源和序列化组这个示例应该可以工作,但是(如果需要子资源)您也可以混合子资源和序列化,但在您的情况下,我认为第一个解决方案是最好的。
随时随地看视频慕课网APP
我要回答