2

我在 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);
    }
}
4

1 回答 1

0

嗨,

如果您可以停用 FosUserBundle 发送电子邮件并创建一个自定义侦听器来制作相同的内容,请获取 FosUserBundle 侦听器的代码并对其进行调整(例如:添加 if($user instanceof CmsUser) 等)以发送每种类型的自定义电子邮件.

检查 /vendor/friendsofsymfony/user-bundle/EventListener 中的侦听器(EmailConfirmationListener 和 ResettingListener)

于 2018-03-29T12:44:38.483 回答