Symfony ApiPlatform:在实体中作为序列化器/组的角色是个好主意吗?

Posted

技术标签:

【中文标题】Symfony ApiPlatform:在实体中作为序列化器/组的角色是个好主意吗?【英文标题】:Symfony ApiPlatform: Role as Serializer/Groups in Entity is good idea? 【发布时间】:2021-11-14 23:56:06 【问题描述】:

我在应用程序中有很多角色,包括。 超级管理员、管理员、用户、版主、编辑... 我想使用 apiPlatform 并在实体中为角色适当地显示适当的字段,我还制作了额外的类,将角色转换为类。一切正常。 但是,它打破了序列化程序中组的想法。例如:我有几个相互关联的实体。当我是管理员并且想要下载实体时,即使我不使用它们,“admin:read”组的所有属性都将下载 + 相关类中的所有属性也将使用“admin:read”组。没事吧?在实体中使用角色是个好主意吗?还有更好的方法吗?

来自https://api-platform.com/docs/core/serialization/的示例

课本

<?php
// api/src/Entity/Book.php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;

#[ApiResource(normalizationContext: ['groups' => ['book']])]
class Book

    /**
     * @Groups("book")
     */
    public $name;

    /**
     * @Groups("book")
     */
    public $author;

    // ...

类人

<?php
// api/src/Entity/Person.php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;

#[ApiResource]
class Person

    /**
     * ...
     * @Groups("book")
     */
    public $name;

    // ...

结果


  "@context": "/contexts/Book",
  "@id": "/books/62",
  "@type": "Book",
  "name": "My awesome book",
  "author": 
    "@id": "/people/59",
    "@type": "Person",
    "name": "Kévin Dunglas"
  

因此,如果您键入“admin:read”而不是“book”,它将始终序列化具有组“admin:read”的所有内容。我认为它正在获取不必要的数据。 我想强调的是,实体有很多,不像两个/几个的例子。

【问题讨论】:

【参考方案1】:

我认为在序列化中添加角色是个好主意,但是当您在序列化中添加角色时,您应该装饰 api_platform.serializer.context_builder 请参阅本节https://api-platform.com/docs/core/serialization/#changing-the-serialization-context-dynamically

【讨论】:

以上是关于Symfony ApiPlatform:在实体中作为序列化器/组的角色是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony NotBlank 约束允许空白字符串

异常呈现 symfony html 错误页面而不是 JSON 响应

CORS..Angular 和 API 平台 Symfony 的问题

我如何在没有 symfony 的项目中重用我的 symfony 实体

在 Symfony 上生成迁移时忽略实体

在symfony 4中映射实体