Не удается автоматически подключить сервис в Symfony 3.4 и FosUserBundle - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь переопределить 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".

1 Ответ

0 голосов
/ 25 февраля 2019

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

# services.yaml

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

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

Решение:

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

С помощью автоматической разводки и автоконфигурирования вы даже можете sypmlify:

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