Я пытаюсь переопределить 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".
Ваш ответ указан в сообщении об ошибке 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". Пробовали ли вы какие-либо из них?
Спасибо за ваши ответы. @Domagoj: я пробовал с '@fos_user.mailer.twig_swift', но проблема все еще существует.
@Preciel: если служба псевдонимов состоит в том, чтобы добавить в services.yml: псевдоним fos_user.mailer: '@fos_user.mailer.twig_swift' и заменить '@fos_user.mail.twig_swift' на '@fos_user.mailer' в службе, я сделал это но прочь та же ошибка :(




Я полагаю, вы используете автообнаружение сервисов. Что-то типа:
# 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'
Проблема устранена! Кажется, он работает только с кодом, который вы мне дали, поэтому мой вопрос: мне нужно добавить свой сервис или нужен только ваш? Большое спасибо!
Нет необходимости в app.redirect_after_registration_subscriber, вы должны удалить его.
Хорошо, спасибо вам! У меня есть другая проблема, в моей конфигурации администратор создает учетную запись пользователя, после чего пользователю отправляется электронное письмо. Таким образом, пользователь не вошел на веб-сайт, когда он нажимает на электронное письмо с подтверждением. После нажатия на ссылку он перенаправляется на форму входа, а не на подтвержденную страницу напрямую. Я мог бы автоматически регистрировать пользователя, если это возможно. Возможно ли переопределить слушателя Registration_confirm или Registration_confirmed??
Вы пробовали
'@fos_user.mailer.twig_swiftвместо'@fos_user.mailer'?