2017-10-23 15 views
0

내 API에 api-platform 덕분에 생성 된 맞춤 확장을 만들고 싶습니다. 나는 똑같은 일을하기 위해 documentation about extensions을 따르려고했다 : 현재 사용자가 소유 한 데이터를 얻는다. 하지만 다음과 같은 오류가 발생했습니다 :맞춤 확장 - CurrentUserExtension, Symfony 오류

(1/1) FatalThrowableError Type error: Argument 1 passed to AppBundle\Doctrine\ORM\Extension\CurrentUserExtension::__construct() must implement interface Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface, none given, called in /var/www/api/var/cache/dev/appDevDebugProjectContainer.php on line 579

캐시 파일을 삭제하려고했지만 동일한 문제가 있습니다.

내 구성 :
심포니/심포니 v3.3.10
API를 플랫폼/스키마 생성기 : V1.2.0

api_filters.yml :

services: 
    ... 
    'AppBundle\Doctrine\ORM\Extension\CurrentUserExtension': 
     tags: 
      - { name: api_platform.doctrine.orm.query_extension.collection, priority: 9 } 
      - { name: api_platform.doctrine.orm.query_extension.item } 

CurrentUserExtension.php :

<?php 

namespace AppBundle\Doctrine\ORM\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 AppBundle\Entity\User; 
use AppBundle\Entity\Voyage; 
use Doctrine\ORM\QueryBuilder; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; 

final class CurrentUserExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface 
{ 
    private $tokenStorage; 
    private $authorizationChecker; 

    public function __construct(TokenStorageInterface $tokenStorage, AuthorizationChecker $checker) 
    { 
     $this->tokenStorage = $tokenStorage; 
     $this->authorizationChecker = $checker; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null) 
    { 
     $this->addWhere($queryBuilder, $resourceClass); 
    } 

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

    /** 
    * 
    * @param QueryBuilder $queryBuilder 
    * @param string  $resourceClass 
    */ 
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass) 
    { 
     $user = $this->tokenStorage->getToken()->getUser(); 
     if ($user instanceof User && Voyage::class === $resourceClass && !$this->authorizationChecker->isGranted('ROLE_USER')) { 
      $rootAlias = $queryBuilder->getRootAliases()[0]; 
      $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias)); 
      $queryBuilder->setParameter('current_user', $user->getId()); 
     } 
    } 
} 

config.yml :

[...] 
doctrine: 
    dbal: 
     driver: pdo_mysql 
     host: '%database_host%' 
     port: '%database_port%' 
     dbname: '%database_name%' 
     user: '%database_user%' 
     password: '%database_password%' 
     server_version: '5.7' 
     charset: UTF8 

    orm: 
     auto_generate_proxy_classes: '%kernel.debug%' 
     naming_strategy: doctrine.orm.naming_strategy.underscore 
     auto_mapping: true 

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: AppBundle\Entity\User 
    from_email: 
     address:  "%mailer_user%" 
     sender_name: Guilhem 

api_platform: 
    title:   API - Le Monde en Sac 
    description:  The core API for the website Le Monde en Sac 
    enable_fos_user: true 
    http_cache: 
     invalidation: 
      enabled: false 
      varnish_urls: [] 
    eager_loading: 
     max_joins: 1 

어디에서 문제가 발생 했습니까?

답변

0

문제가 해결 :

service.yml :

services: 
    'AppBundle\Doctrine\ORM\Extension\CurrentUserExtension': 
     arguments: 
      - '@security.token_storage' 
      - '@security.authorization_checker' 
     tags: 
      - { name: api_platform.doctrine.orm.query_extension.collection, priority: 9 } 
      - { name: api_platform.doctrine.orm.query_extension.item } 
+0

마음, 내가 그것을 서비스를 시작있어하는 방법을 알려주? 위의 모든 작업을 수행했지만 내 엔티티에서이를 참조하는 방법을 잘 모르겠습니다. – Doug