【问题标题】:Symfony 5 API populate related object entitiesSymfony 5 API 填充相关的对象实体
【发布时间】:2020-07-06 16:46:05
【问题描述】:

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

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

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

{
    "id": 1,
    "program": {
        "id": 1,
        "name": "First program"
    },
    "description": "fgdfg",
    "comment": "dfgdfg"
{

所以,这就是表格的外观:

我认为setting up a subresource 足以获取对象,但事实并非如此:

  1. InventoryItem实体中配置@ApiSubresource注解Program属性:

    /**
     * @ORM\ManyToOne(targetEntity=Program::class, inversedBy="inventoryItems")
     * @ORM\JoinColumn(nullable=false)
     * @ApiSubresource
     */
    private $program;
    
  2. 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 的任何想法?

【问题讨论】:

    标签: php rest symfony api-platform.com


    【解决方案1】:

    您正在搜索对您的商品进行序列化。所以我想这更像是一个序列化问题而不是子资源问题。 我认为你应该使用serialization group 而不是 SubResource。

    SOLUTION1序列化嵌入关系

    "Embedding relation" 提供了 Book 和 Author 的示例。

    <?php
    // api/src/Entity/Item.php
    
    namespace 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.php
    
    namespace 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混合子资源和序列化组

    这个例子应该可以工作,但是(如果需要子资源)你也可以混合subresources and serializations,但在你的情况下,我猜第一个解决方案是最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多