【问题标题】:Custom Extension - CurrentUserExtension, Symfony error自定义扩展 - CurrentUserExtension,Symfony 错误
【发布时间】:2017-10-23 11:25:27
【问题描述】:

我想在我的 API 中创建一个自定义扩展,这要感谢 api-platform。我试图按照documentation about extensions 做同样的事情:获取当前用户拥有的数据。但我有以下错误:

(1/1) FatalThrowableError 类型错误:传递给 AppBundle\Doctrine\ORM\Extension\CurrentUserExtension::__construct() 的参数 1 必须实现接口 Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface,没有给出,在 /var/www/ 中调用api/var/cache/dev/appDevDebugProjectContainer.php 第 579 行

我试图删除缓存文件,但我遇到了同样的问题。

我的配置:
symfony/symfony v3.3.10
api-platform/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

你知道问题出在哪里吗?

【问题讨论】:

    标签: api-platform.com


    【解决方案1】:

    问题解决了:

    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 }
    

    【讨论】:

    • 介意,让我知道如何让它启动服务?我已完成上述所有操作,但不确定如何在我的实体中引用它?
    • @Doug 一定要看看 both 答案stackoverflow.com/questions/10330704/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多