2017-10-23 2 views
0

Ich möchte eine benutzerdefinierte Erweiterung in meiner API erstellen, erstellt, dank api-platform. Ich habe versucht, dem documentation about extensions zu folgen, um genau die gleiche Sache zu tun: Erhalten Sie Daten, die dem gegenwärtigen Benutzer gehören. Aber ich habe folgenden Fehler:Benutzerdefinierte Erweiterung - CurrentUserExtension, Symfony-Fehler

(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

Ich habe versucht, Cache-Dateien zu entfernen, aber ich habe das gleiche Problem.

Meine Konfiguration:
symfony/symfony v3.3.10
api-Plattform/schema-Generator: 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 

Haben Sie eine Idee, wo das Problem liegt?

Antwort

0

Problem gelöst:

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

Geist, lassen Sie mich wissen, wie es zu bekommen, den Dienst zu initiieren? Ich habe all das oben Gesagte getan, aber ich bin mir nicht sicher, wie ich es in meiner Entität referenzieren soll. – Doug

Verwandte Themen