Skip to content

Instantly share code, notes, and snippets.

@tamert
Last active August 29, 2020 21:16
Show Gist options
  • Save tamert/de36502c08ddc8301bc3161b9c454a21 to your computer and use it in GitHub Desktop.
Save tamert/de36502c08ddc8301bc3161b9c454a21 to your computer and use it in GitHub Desktop.
NewsExtension.php
<?php
namespace App\DoctrineExtension;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Entity\News;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Security\Core\Security;
class NewsExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
/**
* @var Security
*/
private $security;
/**
* NewsExtension constructor.
* @param Security $security
*/
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
$this->visibility($queryBuilder, $resourceClass);
}
/**
* {@inheritdoc}
*/
public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = [])
{
$this->visibility($queryBuilder, $resourceClass);
}
/**
*
* @param QueryBuilder $queryBuilder
* @param string $resourceClass
*/
private function visibility(QueryBuilder $queryBuilder, string $resourceClass)
{
if ($resourceClass != News::class) return;
if ($this->security->isGranted('ROLE_ADMIN') return;
$alias = $queryBuilder->getRootAliases()[0];
$queryBuilder
->andWhere($alias.'.status != :newsStatus')
->setParameter('newsStatus', "ACTIVE");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment