rest - symfony api-平台深度

标签 rest symfony api-platform.com

到目前为止,我们一直在努力解决 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/

相关文章:

java - Camel Rest 组件是用于设置服务客户端还是服务提供者?

javascript - 我该如何处理 React 中的未定义错误

symfony4 - Symfony 4 : Test DB for JWT and Behat

database - API 平台 - 处理大数据库的分页

php - Symfony 缓存 :clear Failed to remove directory

java - Resilience4j.retry 异常不起作用

javascript - API 的快速路由 - 拥有子资源时的 URL 处理程序

c# - 为什么要使用 ActionResult

symfony - Doctrine2转换错误

symfony - 使用 'Unknown Entity namespace alias' 时出现错误 'CompanyNameBundle:User'