Отправить письмо с логином и пропустить после регистрации
В настоящее время я работаю над проектом Symfony2 для управления пользователями. Я установил пакет FosUserBundle, который работает, но я не могу найти способ отправки электронного письма, содержащего имя пользователя и пароль, сразу после создания пользователя, поскольку я сказал, что у меня есть два пользователя: администратор и пользователь Тип, и это администратор, который будет создавать пользователей с формой создания, которая является формой регистрации FOS, переключение между двумя добрыми пользователями только роли.
4 ответа
Вы могли бы подключиться к EventDispatcher
и отправьте свою собственную электронную почту, а не ту, которая была сгенерирована FOSUserBundle, используя свою собственную Listener
,
class EmailConfirmationListener implements EventSubscriberInterface
{
private $mailer;
private $router;
private $session;
public function __construct(MailerInterface $mailer,
UrlGeneratorInterface $router)
{
$this->mailer = $mailer;
$this->router = $router;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_SUCCESS => array(
array('onRegistrationSuccess', -10),
),
);
}
public function onRegistrationSuccess(FormEvent $event)
{
/** @var $user \FOS\UserBundle\Model\UserInterface */
$user = $event->getForm()->getData();
// send details out to the user
$this->mailer->sendCreatedUserEmail($user);
// Your route to show the admin that the user has been created
$url = $this->router->generate('blah_blah_user_created');
$event->setResponse(new RedirectResponse($url));
// Stop the later events propagting
$event->stopPropagation();
}
}
Почтовый сервис
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Mailer\Mailer as BaseMailer;
class Mailer extends BaseMailer
{
/**
* @param UserInterface $user
*/
public function sendAdminConfirmationEmailMessage(UserInterface $user)
{
/**
* Custom template using same positioning as
* FOSUSerBundle:Registration:email.txt.twig so that the sendEmailMessage
* method will break it up correctly
*/
$template = 'BlahBlahUser:Admin:created_user_email.txt.twig';
$url = $this->router->generate('** custom login path**', array(), true);
$rendered = $this->templating->render($template, array(
'user' => $user,
'password' => $user->getPlainPassword(),
));
$this->sendEmailMessage($rendered,
$this->parameters['from_email']['confirmation'], $user->getEmail());
}
}
Я думаю, что сделал бы это.. хотя я могу ошибаться.
Это документировано в документации к комплекту:
// src/Acme/UserBundle/Controller/RegistrationController.php
<?php
namespace Acme\UserBundle\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
class RegistrationController extends BaseController
{
public function registerAction()
{
$form = $this->container->get('fos_user.registration.form');
$formHandler = $this->container->get('fos_user.registration.form.handler');
$confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');
$process = $formHandler->process($confirmationEnabled);
if ($process) {
$user = $form->getData();
/*****************************************************
* Add new functionality (e.g. log the registration) *
*****************************************************/
$this->container->get('logger')->info(
sprintf('New user registration: %s', $user)
);
if ($confirmationEnabled) {
$this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
$route = 'fos_user_registration_check_email';
} else {
$this->authenticateUser($user);
$route = 'fos_user_registration_confirmed';
}
$this->setFlash('fos_user_success', 'registration.flash.user_created');
$url = $this->container->get('router')->generate($route);
return new RedirectResponse($url);
}
return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
'form' => $form->createView(),
));
}
}
Просто используйте шаблон и переводчик
конфиг
fos_user:
registration:
form:
template: AppBundle:Registration:email.txt.twig
шаблон
{% trans_default_domain 'FOSUserBundle' %}
{% block subject %}
{%- autoescape false -%}
{{ 'registration.email.subject'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl}) }}
{%- endautoescape -%}
{% endblock %}
{% block body_text %}
{% autoescape false %}
{{ 'registration.email.message'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl, %userpassword%: user.plainPassword}) }}
{% endautoescape %}
{% endblock %}
{% block body_html %}{% endblock %}
Приложение дляпереводчиков \Resources\translations\FOSUserBundle.en.yml
registration:
check_email: |
An email has been sent to %email%. It contains an activation link you must click to activate your account.
confirmed: 'Congrats %username%, your account is now activated.'
back: 'Back to the originating page.'
submit: Register
flash:
user_created: 'The user has been created successfully.'
email:
subject: 'Welcome %username%!'
message: |
Hello %username%!
To finish activating your account - please visit %confirmationUrl%
User name: %username%
Password: %userpassword%
This link can only be used once to validate your account.
Regards,
the Team.
Вот как отправить имя пользователя / адрес электронной почты и пароль пользователю после регистрации с помощью symfony2:
overide email.txt.twig в свой пакет, затем добавьте это тело письма:
{% block subject %}
Welcome to My Application
{% endblock %}
{% block body_html %}
Email : {{ user.email }}
Username : {{ user.username }}
Password : {{ user.plainPassword }}
Activation Link : {{confirmationUrl}}
{% endblock %}
После этого на электронную почту пользователя будет отправлено письмо с адресом электронной почты, именем пользователя, паролем и URL-адресом для активации учетной записи.