Как передать TokenStorageInterface в EntityListener? - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время я работаю над проектом, созданным на Api-платформе и использующим Symfony4.

Моя цель - иметь возможность использовать TokenStorage внутри EntityListener, чтобы узнать личность моего пользователя.

К сожалению, я не могу найти способ передать TokenStorageInterface в качестве аргумента. И система электропроводки, похоже, не работает.

services.yaml:

# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: 'en'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.


    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones
    App\EntityListener\KpiDateListener:
        public: true,
        arguments:
            $tokenStorage: '@security.token_storage'

KpiDateListener.php:

<?php

namespace App\EntityListener;

use ApiPlatform\Core\Tests\Fixtures\TestBundle\Manager\UserManager;
use App\Entity\KpiDate;
use App\Entity\StateDate;
use App\Security\User\UserProvider;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class KpiDateListener
{
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function postPersist(KpiDate $kpiDate, LifecycleEventArgs $args)
    {
        //Here is my function
    }
}

У меня всегда одна и та же ошибка:

Слишком мало аргументов для функции App \ EntityListener \ KpiDateListener :: __ construct (), 0 передано в /srv/api/vendor/doctrine/doctrine-bundle/Mapping/ContainerAwareEntityListenerResolver.php в строке 76 и ожидается ровно 1

Что-то не так или отсутствует?

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2019

Сообщение об ошибке будет означать, что автоподключение не включено для вашего слушателя. Автосервисные работы для сервисов. Если ваш прослушиватель сущностей не зарегистрирован в качестве службы, компонент DI не может автоматически связать его, так как он не знает об этом (и тогда создание экземпляра класса будет выполняться самой Doctrine).

Попробуйте изменить на:

    App\EntityListener\KpiDateListener:
        autowire: true
        public: true,
        arguments:
            $tokenStorage: '@security.token_storage'
        tags:
            - { name: doctrine.orm.entity_listener }
...