Symfony2 / SonataAdminBundle /编辑记录后发送电子邮件

时间:2014-11-09 16:51:25

标签: symfony sonata-admin

在使用SonataAdminBundle编辑记录后,我需要发送基于模板的电子邮件。

在普通网站中,我在控制器中发送电子邮件。像这样:

$message = \Swift_Message::newInstance()
        ->setContentType('text/html')
        ->setSubject('Subject')
        ->setFrom('from@site.com')
        ->setTo($member->getEmail())
        ->setBody(
            $this->renderView(
                'AcmeSiteBundle:Site:email.html.twig',
                array('name' => $member->getFirstName())
            )
        )
    ;
    $this->get('mailer')->send($message);

但是在管理员中我配置了从扩展的 configureFormFields preUpdate postUpdate MyAdmin 的方法管理员

1 个答案:

答案 0 :(得分:5)

解决方案是:使用EventListener。

使用以下代码在 VendorName / SiteBundle / EventListener 中创建文件 AdminApplicationListener.php

<?php

namespace VendorName\SiteBundle\EventListener;

class AdminApplicationListener
{
    /**
     *
     * @var Swift_Mailer
     */
    private $__mailer = null;
    private $__templating = null;

    public function __construct(\Swift_Mailer $mailer, $templating)
    {
        $this->__mailer = $mailer;
        $this->__templating = $templating;
    }

    public function onApplication( \Sonata\AdminBundle\Event\PersistenceEvent $event )
    {       
        $ac = $event->getObject();

        $message = \Swift_Message::newInstance()
            ->setContentType('text/html')
            ->setSubject('[VendorName] Object was edited')
            ->setFrom('admin@VendorName.ru')
            ->setTo($ac->getEmail())
            ->setBody(
                $this->__templating->render(
                    'VendorNameSiteBundle:Admin:email.html.twig',
                    array('name' => $ac->getFirstName())
                )
            )
        ;
        $this->__mailer->send($message);

    }
}

VendorName / SiteBundle / Resources / config / services.yml 中添加:

services:
    vendor_name.admin.on_application:
        class: VendorName\SiteBundle\EventListener\AdminApplicationListener
        arguments:
            mailer: @mailer
            templating: @templating
        tags:
            - { name: kernel.event_listener, event: sonata.admin.event.persistence.post_update, method: onApplication }

我认为这不是最佳做法,但是第一步就可以了:)