首页 > 解决方案 > Symfony ApiPlatform:在实体中作为序列化程序/组的角色是个好主意吗?

问题描述

我在应用程序中有很多角色,包括。super_admin, admin, user, moderator, editor ... 我想使用 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”的所有内容。我认为它正在获取不必要的数据。我想强调的是,有很多实体,不像两个/几个的例子。

标签: phpapisymfonyapi-platform.comuser-roles

解决方案


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


推荐阅读