Api platform 教程9---使用groups

Mario Sanchez

30 people read
Thumbnail

Api platform 教程8---使用groups

前面我们说过,查看对应关系时,我想显示出对应关系的详细信息,或者我们在查看用户信息时,不显示password字段, 有一种方法是使用normalizer,这个我们已经讲过了,但是随着项目越来越大,需要自定义的字段越来越多,这种方法就不再实用了

所以我们使用groups,其实groups也是symfony的序列化和反序列化中的功能,并不是api platform特有的.我们这里只是讲解 如果在api platform中启用而已

#src/Entity/DragonTreasure.php
#[ApiResource(
    operations: [
        new GetCollection(),
        new Get(),
        new Post(),
        new Patch(),
        new Delete(),
    ],
    normalizationContext: ['groups' => ['dragonTreasure.read']],
    denormalizationContext: ['groups' => ['dragonTreasure.write']],
)]

#[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    private ?int $id = null;
    /**
     * @var string|null 宝藏名称
     */
    #[ORM\Column(length: 255)]
    #[Groups(['dragonTreasure.read'])]
    private ?string $name = null;

    #[ORM\Column(type: Types::TEXT)]
    #[Groups(['dragonTreasure.read'])]
    private ?string $description = null;

    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    private ?int $value = null;

    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    private ?int $coolFactor = null;

    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    private ?\DateTimeImmutable $createdAt = null;

    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    private ?bool $isPublished = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['dragonTreasure.read'])]
    private ?User $user = null;
#src/Entity/User.php
#[ORM\Column(length: 180)]
#[Groups(['dragonTreasure.read'])]
private ?string $email = null;

我们DragonTreasure中添加了两个参数,分别是序列化组和反序列化组,然后在字段上和User.php的email字段上都添加了

#[Groups(['dragonTreasure.read'])]

这将会在取数据时返回我们想要的数据,如果在DragonTreasure中我们不想返回某一个字段,那么只需要删除这个注解即可(另一种方法是使用ApiProperty)

#[ORM\Column]
#[Groups(['dragonTreasure.read'])]
#[ApiProperty(readable: false, writable: false)]
private ?\DateTimeImmutable $createdAt = null;

上面的代码中,我们假设不想返回createdAt,那么我们可以指定Groups,也可以使用ApiProperty中的readable:false来关闭返回,writable:false表示 字段提交时字段不可写。

denormalizationContext属性表示我们在提交数据时可见。当然,这两个参数我是写在ApiResource中的,表示所有操作都满足这两个条件。 你了可以写在某一个操作中。

    #[ORM\Column]
    #[Groups(['dragonTreasure.read'])]
    #[Context([DateTimeNormalizer::FORMAT_KEY=>'Y-m-d'])]
    private ?\DateTimeImmutable $createdAt = null;

当我们想把返回的时间修改格式时,可以使用这个方法来自定义,但实际上DateTimeNormalizer和我们写的UserNormalizer没有区别

About Me

我是一位精通 Symfony 框架和 API Platform 的开发者,擅长构建高效、可扩展的 Web 应用程序和 API。 此外,我还具备 PrestaShop 模块开发经验,能够为您的电商平台定制功能,满足特定业务需求。