[英]Symfony 3 Email confirmation on FOSUserBundle Profile Edit
我尝试跟随这个论坛,向个人简介编辑fos用户群发送电子邮件会议。 我创建文件
/src/AppBundle/EventListener.php
namespace AppBundle\EventListener;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class ChangeProfileListener implements EventSubscriberInterface
{
private $mailer;
private $tokenGenerator;
private $router;
private $session;
private $tokenStorage;
public function __construct(
MailerInterface $mailer,
TokenGeneratorInterface $tokenGenerator,
UrlGeneratorInterface $router,
SessionInterface $session, TokenStorageInterface $tokenStorage
) {
$this->mailer = $mailer;
$this->tokenGenerator = $tokenGenerator;
$this->router = $router;
$this->session = $session;
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::PROFILE_EDIT_INITIALIZE => 'onProfileEditInitialize',
FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess',
);
}
public function onProfileEditInitialize(GetResponseUserEvent $event)
{
// required, because when Success's event is called, session already contains new email
$this->email = $event->getUser()->getEmail();
}
public function onProfileEditSuccess(FormEvent $event)
{
$user = $event->getForm()->getData();
if ($user->getEmail() !== $this->email)
{
// disable user
$user->setEnabled(false);
// send confirmation token to new email
$user->setConfirmationToken($this->tokenGenerator->generateToken());
$this->mailer->sendConfirmationEmailMessage($user);
// force user to log-out
$this->tokenStorage->setToken();
// redirect user to check email page
$this->session->set('fos_user_send_confirmation_email/email', $user->getEmail());
$url = $this->router->generate('fos_user_registration_check_email');
$event->setResponse(new RedirectResponse($url));
}
}
}
服役后.yml
parameters:
#parameter_name: value
oc_user.email_change.listener.class: AppBundle\EventListener\ChangeProfileListener
services:
app.form.registration:
class: AppBundle\Form\RegistrationType
tags:
- { name: form.type, alias: app_user_registration }
app.form.profileedit:
class: AppBundle\Form\ProfileType
tags:
- { name: form.type, alias: app_profile_edit }
...
oc_user.email_change.listener:
class: %oc_user.email_change.listener.class%
arguments: ['@fos_user.mailer', '@fos_user.util.token_generator', '@router', '@session', '@security.token_storage']
tags:
- { name: kernel.event_subscriber }
但是我总是有这个错误
(1/1)AutowiringFailedException无法自动装配服务“ AppBundle \\ EventListener \\ ChangeProfileListener”:方法“ __construct()”的参数“ $ mailer”引用接口“ FOS \\ UserBundle \\ Mailer \\ MailerInterface”,但不存在这样的服务。 您可能应该将此接口作为以下现有服务之一的别名:“ fos_user.mailer.default”,“ fos_user.mailer.twig_swift”,“ fos_user.mailer.noop”。
我也重写了表格,但是可以用
可以帮我??
我的配置文件
# app/config/config.yml
fos_user:
db_driver: orm # other valid values are 'mongodb' and 'couchdb'
firewall_name: main
user_class: AppBundle\Entity\User
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
registration:
form:
type: AppBundle\Form\RegistrationType
# if you are using Symfony < 2.8 you should use the type name instead
# type: app_user_registration
confirmation:
enabled: true
profile:
form:
type: AppBundle\Form\ProfileType
fos_user.mailer:
alias: 'fos_user.mailer.default'
错误消息已经说了:
您可能应该将此接口作为以下现有服务之一的别名:“ fos_user.mailer.default”,“ fos_user.mailer.twig_swift”,“ fos_user.mailer.noop”。
该错误发生在您的配置中(标记为--> <--
):
oc_user.email_change.listener:
class: %oc_user.email_change.listener.class%
arguments: [--> '@fos_user.mailer', <-- '@fos_user.util.token_generator', '@router', '@session', '@security.token_storage']
tags:
- { name: kernel.event_subscriber }
您可能必须在FOS UserBundle中启用通知功能:
# app/config/config.yml
fos_user:
# ...
registration:
confirmation:
enabled: true
如文档中所述: https : //symfony.com/doc/current/bundles/FOSUserBundle/emails.html#registration-confirmation
如果这样做没有帮助,您可能要在错误消息中引用提到的一项服务,或者创建一个指向其中一项的别名,例如fos_user.mailer.default
:
fos_user.mailer:
alias: 'fos_user.mailer.default'
然后,您可以保持服务不变,每当您引用fos_user.mail
,它将使用别名中引用的服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.