Как выбрать только книги с атрибутом, принимаемым как значение true в коллекции Операции получают с Symfony Платформа Api - PullRequest
0 голосов
/ 17 июня 2020

Я работаю с Symfony4 и Symfony Api Platform, я хотел бы знать, как выбрать только книги с атрибутом «принято» true как значение для всех пользователей, но выбрать все книги, если пользователь имеет ROLE_ADMIN. Какой компонент платформы Api мне следует использовать?

 * @ApiResource(
 *     attributes={
 *        "pagination_items_per_page"=20,
 *        "order"={"id": "DESC"},
 *     },
 *     collectionOperations={
 *         "get"={
 *             "normalization_context"={"groups"={"book:read"}}
 *         },
 *         "post"={
 *             "denormalization_context"={"groups"={"book:write"}},
 *             "security"="is_granted('POST', object)",
 *             "security_message"="You do not have the rights to post"
 *         },
 *     },
  * @ORM\Entity
 */
class Book
{
 //**

/**
 * @ORM\Column(type="boolean" , nullable=true)
 * @Groups({"book:read", "admin:input"})
 */
private $accepted = false;

1 Ответ

0 голосов
/ 24 июня 2020

Я нашел решение, используя расширения :

https://api-platform.com/docs/core/extensions/

final class BookListingIsEnabledExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
private $security;

public function __construct(Security $security)
{
    $this->security = $security;
}

public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
{
    $this->addWhere($queryBuilder, $resourceClass);
}

public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
{
    $this->addWhere($queryBuilder, $resourceClass);
}

private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
{
    if (Book::class !== $resourceClass || $this->security->isGranted('ROLE_ADMIN')) {
        return;
    }

    $rootAlias = $queryBuilder->getRootAliases()[0];
    $queryBuilder->andWhere(sprintf('%s.accepted = :accepted', $rootAlias))
        ->setParameter('accepted', true);



 }

}
...