Не удается выполнить автоподключение службы в Symfony 3.4 и FosUserBundle

Я пытаюсь переопределить REGISTRATION_SUCCESS в FosUserBundle, чтобы перенаправить администратора в список пользователей после регистрации нового пользователя.

Итак, я создал нового подписчика событий:

<?php
namespace AppBundle\EventListener;

use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class RedirectAfterRegistrationSubscriber implements EventSubscriberInterface
{
    private $mailer;
    private $tokenGenerator;
    private $router;

    public function __construct(MailerInterface $mailer, TokenGeneratorInterface $tokenGenerator, UrlGeneratorInterface $router)
    {
        $this->mailer = $mailer;
        $this->tokenGenerator = $tokenGenerator;
        $this->router = $router;
    }

    public function onRegistrationSuccess(FormEvent $event)
    {
        $user = $event->getForm()->getData();

        $user->setEnabled(false);
        if (null === $user->getConfirmationToken()) {
            $user->setConfirmationToken($this->tokenGenerator->generateToken());
        }

        $this->mailer->sendConfirmationEmailMessage($user);

        $url = $this->router->generate('user_index');
        $event->setResponse(new RedirectResponse($url));
    }

    public static function getSubscribedEvents()
    {
        return [
            FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess'
        ];
    }
}

и следующий сервис:

app.redirect_after_registration_subscriber:
    class: AppBundle\EventListener\RedirectAfterRegistrationSubscriber
    arguments: ['@fos_user.mailer', '@fos_user.util.token_generator', '@router']
    tags:
        - { name: kernel.event_subscriber }

Я не понимаю, почему появляется эта ошибка:

Cannot autowire service "AppBundle\EventListener\RedirectAfterRegistrationSubscriber": 
argument "$mailer" of method "__construct()" references interface 
"FOS\UserBundle\Mailer\MailerInterface" but no such service exists. You should maybe alias
this interface to one of these existing services: "fos_user.mailer.default",
"fos_user.mailer.twig_swift", "fos_user.mailer.noop".

Вы пробовали '@fos_user.mailer.twig_swift вместо '@fos_user.mailer' ?

Domagoj 24.02.2019 21:56

Ваш ответ указан в сообщении об ошибке You should maybe alias this interface to one of these existing services: "fos_user.mailer.default", "fos_user.mailer.twig_swift", "fos_user.mailer.noop". Пробовали ли вы какие-либо из них?

Preciel 24.02.2019 23:18

Спасибо за ваши ответы. @Domagoj: я пробовал с '@fos_user.mailer.twig_swift', но проблема все еще существует.

Denis Ancelle 25.02.2019 10:01

@Preciel: если служба псевдонимов состоит в том, чтобы добавить в services.yml: псевдоним fos_user.mailer: '@fos_user.mailer.twig_swift' и заменить '@fos_user.mail.twig_swift' на '@fos_user.mailer' в службе, я сделал это но прочь та же ошибка :(

Denis Ancelle 25.02.2019 10:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
4
1 428
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я полагаю, вы используете автообнаружение сервисов. Что-то типа:

# services.yaml

AppBundle\:
    resource: '../src/'
...

Таким образом, в дополнение к @app.redirect_after_registration_subscriber, который вы определяете, Symfony определяет еще один сервис с идентификатором @AppBundle\EventListener\RedirectAfterRegistrationSubscriber. Оба указывают на класс AppBundle\EventListener\RedirectAfterRegistrationSubscriber. Но вы настроили параметр mailer только для первого.

Решение:

AppBundle\EventListener\RedirectAfterRegistrationSubscriber:
    arguments: ['@fos_user.mailer', '@fos_user.util.token_generator', '@router']
    tags:
        - { name: kernel.event_subscriber }

С автоподключением и автонастройкой вы даже можете подключиться к:

AppBundle\EventListener\RedirectAfterRegistrationSubscriber:
    arguments:
        $mailer: '@fos_user.mailer'

Проблема устранена! Кажется, он работает только с кодом, который вы мне дали, поэтому мой вопрос: мне нужно добавить свой сервис или нужен только ваш? Большое спасибо!

Denis Ancelle 25.02.2019 12:11

Нет необходимости в app.redirect_after_registration_subscriber, вы должны удалить его.

VladRia 25.02.2019 13:13

Хорошо, спасибо вам! У меня есть другая проблема, в моей конфигурации администратор создает учетную запись пользователя, после чего пользователю отправляется электронное письмо. Таким образом, пользователь не вошел на веб-сайт, когда он нажимает на электронное письмо с подтверждением. После нажатия на ссылку он перенаправляется на форму входа, а не на подтвержденную страницу напрямую. Я мог бы автоматически регистрировать пользователя, если это возможно. Возможно ли переопределить слушателя Registration_confirm или Registration_confirmed??

Denis Ancelle 25.02.2019 21:41
stackoverflow.com/questions/9550079/…
VladRia 26.02.2019 09:42

Другие вопросы по теме