我正在使用Symfony4和Symfony Api平台,我想知道如何只选择具有属性“接受”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;发布于 2020-06-24 11:56:46
我通过使用扩展找到了一个解决方案:
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);
}
}https://stackoverflow.com/questions/62430519
复制相似问题