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没有区别