#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 Да, конечно