Сервис Symfony 3.4 - экземпляр Doctrine \ ORM \ EntityManager, задан логический - PullRequest
0 голосов
/ 21 сентября 2018

У меня в настоящее время есть ошибка со службой, так как я обновил Symfony 3.4 с версии 3.0.

У меня есть SwitchUserListener, который получает пару объектов в своей конструкции, но ему не удается получить EntityManager, даже если он у меня есть Type-Hinted.Я также добавил открытый ключ к своим службам

Я получаю FatalThrowableError, потому что экземпляр класса создается с логическим значением вместо объекта EntityManager.

Сообщение об ошибке

Ошибка типа: аргумент 10, передаваемый в Dbm \ UserBundle \ Security \ SwitchUserListener :: __ construct (), должен быть экземпляром Doctrine \ ORM \ EntityManager, логическим значением которого вызывается в C: \ wamp64 \ www \ Portail \var \ cache \ dev \ ContainerWyiblvw \ getSecurity_Authentication_SwitchuserListener_MainService.php в строке 8

FatalThrowableError Line

SwitchUserListener -> token (>) конструкцияobject (EmailUserProvider), object (UserChecker), 'main', object (TraceableAccessDecisionManager), object (Logger), '_switch_user', 'ROLE_ALLOWED_TO_SWITCH', object (TraceableEventDispatcher), false , object) AuthorizationCв var \ cache \ dev \ ContainerWyiblvw \ getSecurity_Authentication_SwitchuserListener_MainService.php

Вот что у меня сейчас.

services.yml

services:
    _defaults:
        public: true
        autowire: true
        autoconfigure: true

    security.authentication.switchuser_listener:
        class: Dbm\UserBundle\Security\SwitchUserListener
        arguments:
            - '@security.token_storage'
            - ~
            - '@security.user_checker'
            - ~
            - '@security.access.decision_manager'
            - '@logger'
            - ''
            - ''
            - '@event_dispatcher'
            - '@doctrine.orm.entity_manager'
            - '@security.authorization_checker'
        tags:
            - { name: monolog.logger, channel: security }

SwitchUserListener.php

namespace Dbm\UserBundle\Security;
...
use Doctrine\ORM\EntityManager;

class SwitchUserListener implements ListenerInterface
{
    private $tokenStorage;
    private $provider;
    private $userChecker;
    private $providerKey;
    private $accessDecisionManager;
    private $usernameParameter;
    private $role;
    private $logger;
    private $dispatcher;
    private $em;
    private $authCheck;

    public function __construct(TokenStorageInterface $tokenStorage,
                                UserProviderInterface $provider,
                                UserCheckerInterface $userChecker,
                                $providerKey,
                                AccessDecisionManagerInterface $accessDecisionManager,
                                LoggerInterface $logger = null,
                                $usernameParameter = '_switch_user',
                                $role = 'ROLE_ALLOWED_TO_SWITCH',
                                EventDispatcherInterface $dispatcher = null,
                                EntityManager $em,
                                AuthorizationChecker $authCheck)
    {
        ...
    }

1 Ответ

0 голосов
/ 21 сентября 2018

РЕДАКТИРОВАТЬ

Наконец-то нашел мою ошибку.Я переопределял switchuser_listener из "Symfony \ Bundle \ SecurityBundle \ Resources \ config \ securityListeners.xml" своим собственным сервисом, и я предполагаю последние аргументы из их списка (10-й хе-хе ... хе ...), который не былтам, перед моими обновлениями, заставил меня добавить его в мой файл services.yml

security_listeners.xml

    <service id="security.authentication.switchuser_listener" class="Symfony\Component\Security\Http\Firewall\SwitchUserListener" abstract="true">
        <tag name="monolog.logger" channel="security" />
        <argument type="service" id="security.token_storage" />
        <argument /> <!-- User Provider -->
        <argument /> <!-- User Checker -->
        <argument /> <!--  Provider Key -->
        <argument type="service" id="security.access.decision_manager" />
        <argument type="service" id="logger" on-invalid="null" />
        <argument>_switch_user</argument>
        <argument>ROLE_ALLOWED_TO_SWITCH</argument>
        <argument type="service" id="event_dispatcher" on-invalid="null"/>
        <argument>false</argument> <!-- Stateless -->
    </service>

Текст ниже по-прежнему действителен, онправильный ответ на вопрос.Но причина в этом редактировании.

КОНЕЦ РЕДАКТИРОВАНИЯ

Мне как-то удалось исправить эту странную проблему, установив autowire в false, и я также добавил дополнительныйпараметр, где «ложь» была (10th args).

Только так я смог «пропустить» проблему.Это немного грязно, чтобы делать это так.Но это работает.

Аргументы, отправленные зависимостью, были просто неверны.(По крайней мере, я так думаю)

Это обходной путь, я не буду отмечать его как ответивший, поэтому, если кто-то найдет фактический ответ, я отмечу его как правильный ответ

Вот изменения

services.yml Я просто добавил дополнительные пустые аргументы в 10-й позиции

services:
    _defaults:
        public: true
        autowire: true
        autoconfigure: true

    security.authentication.switchuser_listener:
        class: Dbm\UserBundle\Security\SwitchUserListener
        autowire: false
        arguments: 
            - '@security.token_storage'
            - ~
            - '@security.user_checker'
            - ''
            - '@security.access.decision_manager'
            - '@logger'
            - ''
            - ''
            - '@event_dispatcher'
            - ''  
            - '@doctrine.orm.entity_manager'
            - '@security.authorization_checker'
        tags:
            - { name: monolog.logger, channel: security }

SwitchUserListener.php Я простодобавлен дополнительный параметр на 10-й позиции

public function __construct(TokenStorageInterface $tokenStorage,
                            UserProviderInterface $provider,
                            UserCheckerInterface $userChecker,
                            $providerKey,
                            AccessDecisionManagerInterface $accessDecisionManager,
                            LoggerInterface $logger = null,
                            $usernameParameter = '_switch_user',
                            $role = 'ROLE_ALLOWED_TO_SWITCH',
                            EventDispatcherInterface $dispatcher = null,
                            $buggyParam, //Not doing anything with this
                            EntityManagerInterface $em,
                            AuthorizationChecker $authCheck)
{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...