首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Symfony Api平台在collectionOperations中选择属性为true的书籍

如何用Symfony Api平台在collectionOperations中选择属性为true的书籍
EN

Stack Overflow用户
提问于 2020-06-17 13:44:53
回答 1查看 60关注 0票数 0

我正在使用Symfony4和Symfony Api平台,我想知道如何只选择具有属性“接受”true作为所有用户的值的书籍,但是如果用户有ROLE_ADMIN,则选择所有的图书。我应该使用Api平台的哪个组件?

代码语言:javascript
复制
 * @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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-24 11:56:46

我通过使用扩展找到了一个解决方案:

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

代码语言:javascript
复制
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);



 }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62430519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档