API 平台可以使用序列化器 Symfony 捆绑包 https://symfony.com/doc/current/components/serializer.html及其注释集。
为了定义操作返回的内容,我们使用normalizationContext
它定义了要包含在 api 操作结果中的属性组。要包含的属性然后将该组名称链接到@Groups
序列化器注释
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity()
* @ApiResource(normalizationContext={"groups"={"read"}}
*/
class Book {
/**
* @ORM\Column()
* @Groups({"read"})
*/
private $title;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="books")
* @Groups({"read"})
*/
private $author;
/**
* Will not be included in result
*/
private $secret_comment;
}
如果关系列在组中为$author
在这里,子类中的组中定义的属性将包含在结果中
/**
* @ORM\Entity()
* @ApiResource(normalizationContext={"groups"={"read"}})
*/
class User {
/**
* @ORM\Column()
* @Groups({"read"})
*/
private $username;
}
为了避免循环递归,您可以使用注释指定子关系连接的最大深度@MaxDepth(n)
其中 n 是最大深度(在您的情况下为 1)。该注释必须启用enable_max_depth
序列化器上下文中的属性@ApiResource
注解
/**
* @ApiPlatform(normalizationContext={"groups"={"read"}, "enable_max_depth"=true})
*/
class Book {
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="books")
* @Groups({"read"})
* @MaxDepth(1)
*/
private $author;
}
请注意,在这种情况下,API 平台是现有捆绑包和功能的聚合。请参阅主要捆绑包以获取详细信息(此处为 Symfony Serializer 捆绑包)