Как правильно получить вложенную коллекцию с помощью GraphQL?

#symfony #graphql #api-platform.com

Вопрос:

У меня есть 2 сущности:

 User
Book
 

Обе сущности представлены как ресурсы API (я использую DTO).

 //src/Entity/User.php
#[ApiResource(
    collectionOperations: [
    'get' => [
        'security' => 'is_granted("ROLE_ADMIN")'
    ],
],
    graphql: [
    'collection_query' => [
        'security' => 'is_granted("ROLE_ADMIN")'
    ],
    'item_query',
],
    itemOperations: [
    'get',
],
    denormalizationContext: ['groups' => ['user:write']],
    normalizationContext: ['groups' => ['user:read']],
    output: UserOutput::class
)]
...

//src/Entity/Book.php
#[ApiResource(
    collectionOperations: [
    'get' => [
        'security' => 'is_granted("ROLE_ADMIN")'
    ],
],
    graphql: [
    'collection_query' => [
        'security' => 'is_granted("ROLE_ADMIN")'
    ],
    'item_query',
],
    itemOperations: [
    'get',
],
    denormalizationContext: ['groups' => ['book:write']],
    normalizationContext: ['groups' => ['book:read']],
    output: BookOutput::class
)]
...
 

Я хочу разрешить только администраторам просматривать коллекции обоих объектов, но мне также нужно иметь возможность получить вложенную коллекцию:

 query {
    user(id: "/api/users/01F63NKKN7DWYB74K6G5N33DPP") {
    id
    books{
      edges{
        node{
          id
        }
      }
    }
    }
}

Result: Access Denied.
 

Я могу получить коллекцию с помощью REST, но как я могу получить коллекцию с помощью GraphQL? Я в замешательстве. Что я могу сделать в этой ситуации?

UPD:

 //src/Dto/UserOutput.php
final class UserOutput
{
    #[Groups(['user:read', 'book:read'])]
    public Ulid $id;

    ...

    /** @var Book[] */
    #[Groups(['user:read'])]
    public iterable $books;
}

//src/Dto/BookOutput.php
final class BookOutput
{
    #[Groups(['book:read', 'user:read'])]
    public Ulid $id;

    #[Groups(['book:read'])]
    public User $user;

    ...
}
 

Комментарии:

1. работает ли это, если безопасность отключена/закомментирована?

2. @xadm Да, конечно