gpt4 book ai didi

rest - symfony api-平台深度

转载 作者:行者123 更新时间:2023-12-04 12:50:25 25 4
gpt4 key购买 nike

到目前为止,我们一直在努力解决 Symfony、Doctrine 和序列化器的深度问题。

我希望能够使用 Symfony 提供仅一级深度的 JSON REST API,允许我直接从 View 管理我的“外键”和关系逻辑。

GET/people/1

{
id:1,
name:"theonewhoknocks",
friends: [3, 12, 25]
}

使用 FosRESTBundle,我们一直在努力实现这一目标。 (我们已经看到模型的“深度”注释和“组” View ,但这些都不符合我们的需要)。

问题很简单,在我们为 future 的 API 做出选择之前,我们必须知道:

api-platform能够提供一个非常简单的一级(带有明显的外键)REST API 吗?

最佳答案

API 平台可以使用 Serializer Symfony bundle及其注释集。

为了定义操作将返回什么,我们使用 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)。此注解必须在 @ApiResource 注解的序列化上下文中使用 enable_max_depth 属性启用

/**
* @ApiPlatform(normalizationContext={"groups"={"read"}, "enable_max_depth"=true})
*/
class Book {
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="books")
* @Groups({"read"})
* @MaxDepth(1)
*/
private $author;
}

请注意,在这种情况下,API 平台是现有 bundle 和功能的集合。有关详细信息,请参阅主要包(这里是 Symfony 序列化器包)

关于rest - symfony api-平台深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39723309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com