我在 symfony 中有一个使用 FosUserBundle 和 PugxMultiUserBundle 的项目,因为我需要 2 种用户类型。有 CmsUsers 和 Platform 播放器。
我需要一种方法来为每个用户类型设置 Fos 电子邮件模板(重置模板、注册模板等)。一个用于 CmsUser 的重置模板和另一个用于播放器的模板。注册也是一样。
出现问题是因为这些模板是在 config.yaml 中配置的
fos_user:
db_driver: orm
firewall_name: api
user_class: PanelBundle\Entity\User
from_email:
address: '%fos_from_address%'
sender_name: '%fos_from_name%'
service:
mailer: api.custom_mailer
user_manager: pugx_user_manager
registration:
confirmation:
enabled: true
template: 'ApiBundle:Email:confirm.email.twig'
resetting:
retry_ttl: 1800 # After how much seconds (30 min) user can request again pass reset
token_ttl: 604800 # After how much seconds (1 week) user token is valid (inactive in user mailbox)
email:
template: 'ApiBundle:Email:resetting.email.twig'
我需要一种以有条件的方式配置或实现它的方法。如果用户类型是 CmsUser 加载这个模板,否则加载另一个。
<?php
namespace ApiBundle\Mailer;
use FOS\UserBundle\Mailer\TwigSwiftMailer as BaseMailer;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class CustomUserMailer extends BaseMailer
{
public function __construct(\Swift_Mailer $mailer, UrlGeneratorInterface $router, \Twig_Environment $twig, array $parameters)
{
parent::__construct($mailer, $router, $twig, $parameters);
}
/**
* @param string $templateName
* @param array $context
* @param string $fromEmail
* @param string $toEmail
*/
protected function sendMessage($templateName, $context, $fromEmail, $toEmail)
{
// Create a new mail message.
$message = \Swift_Message::newInstance();
$context['images']['top']['src'] = $message->embed(\Swift_Image::fromPath(
__DIR__.'/../../../web/assets/img/email/header.jpg'
));
$context['images']['bottom']['src'] = $message->embed(\Swift_Image::fromPath(
__DIR__.'/../../../web/assets/img/email/footer.jpg'
));
$context = $this->twig->mergeGlobals($context);
$template = $this->twig->loadTemplate($templateName);
$subject = $template->renderBlock('subject', $context);
$textBody = $template->renderBlock('body_text', $context);
$htmlBody = $template->renderBlock('body_html', $context);
$message->setSubject($subject);
$message->setFrom($fromEmail);
$message->setTo($toEmail);
$message->setBody($htmlBody, 'text/html');
$message->addPart($textBody.'text/plain');
$this->mailer->send($message);
}
}