Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
php:symfony:расширения_orm_extension [2024/04/15 21:37] mirocowphp:symfony:расширения_orm_extension [2024/04/15 22:57] (текущий) mirocow
Строка 2: Строка 2:
  
 ====== Расширения ORM / Extension ====== ====== Расширения ORM / Extension ======
 +
 +  * QueryCollectionExtensionInterface
 +  * QueryItemExtensionInterface
 +
 +===== Настройки / Использование =====
  
 services.yaml services.yaml
Строка 9: Строка 14:
 services: services:
  
-    'App\Extension\CurrentUserExtension'+    App\Extension\CurrentUserExtension: 
-        tags: +            tags: 
-            - { name: api_platform.doctrine.orm.query_extension.collection, priority: 9 +                - { name: api_platform.doctrine.orm.query_extension.collection } 
-            - { name: api_platform.doctrine.orm.query_extension.item }+                - { name: api_platform.doctrine.orm.query_extension.item }
  
 </code> </code>
Строка 21: Строка 26:
 namespace App\Extension; namespace App\Extension;
  
 +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\Post;
 +use App\Entity\User;
 use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
-use App\Repository\UserRepository; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
-use ApiPlatform\Metadata\Operation; +use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
-use Symfony\Bundle\SecurityBundle\Security+
-use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface+
-use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface; +
-use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;+
  
-class CurrentUserExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface+final class CurrentUserExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
 { {
-    public function __construct( +    private $tokenStorage; 
-        private readonly Security $security+    private $authorizationChecker; 
-        private readonly UserRepository $userRepository +    const ENTITIES = [ 
-    )+        Post::class
 +        User::class 
 +    ]; 
 + 
 +    public function __construct(TokenStorageInterface $tokenStorage, AuthorizationCheckerInterface $checker)
     {     {
 +        $this->tokenStorage = $tokenStorage;
 +        $this->authorizationChecker = $checker;
     }     }
  
-    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, Operation $operation = null, array $context = []): void+    /** 
 +     * {@inheritdoc} 
 +     */ 
 +    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
     {     {
-        $this->addWhere($queryBuilder);+        $this->addWhere($queryBuilder, $resourceClass);
     }     }
  
-    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass,array $identifiers, Operation $operation = null, array $context = []): void+    /** 
 +     * {@inheritdoc} 
 +     */ 
 +    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = [])
     {     {
-        $this->addWhere($queryBuilder);+        $this->addWhere($queryBuilder, $resourceClass);
     }     }
  
-    private function addWhere(QueryBuilder $queryBuilder): void+    /** 
 +     * 
 +     * @param QueryBuilder $queryBuilder 
 +     * @param string $resourceClass 
 +     */ 
 +    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass)
     {     {
-        $user = $this->userRepository->findOneBy([ +        $user = $this->tokenStorage->getToken()->getUser(); 
-            'username' => $this->security->getUser()->getUserIdentifier() +        if ($user instanceof User && in_array($resourceClass, self::ENTITIES) 
-        ])+            && !$this->authorizationChecker->isGranted('ROLE_ADMIN') 
- +        ) { 
-        if ($user === null{ +            $rootAlias = $queryBuilder->getRootAliases()[0]; 
-            return;+            $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias)); 
 +            $queryBuilder->setParameter('current_user', $user->getId());
         }         }
- 
-        $rootAlias = $queryBuilder->getRootAliases()[0]; 
-        $queryBuilder->innerJoin(sprintf('%s.createdBy', $rootAlias), 'u'); 
-        $queryBuilder->andWhere(sprintf('%s.username = :current_user', 'u' )); 
-        $queryBuilder->setParameter('current_user', $user->getUserIdentifier()); 
     }     }
 } }