Symfony2 - 如何在控制器中调用Swiftmailer服务

时间:2014-08-28 01:54:56

标签: email symfony service controller swiftmailer

我还在学习如何将Swiftmailer设置为服务,我相信我有一个有效的解决方案但需要一些帮助才能在控制器中调用它。

如何在我的控制器中调用此服务?(服务代码,服务之前的原始代码和以下service.yml)

编辑: 我试着像这样称呼它:

$emailManager = $this->container->get('email_manager');

$content = $emailManager->sendMail($subject, $recipientName, $recipientEmail, $bodyHtml, $bodyText);

但是我得到一个未定义的变量错误:

Notice: Undefined variable: subject in /.../DefaultController.php line 58

EmailManager服务

namespace Acme\EmailBundle\Service;

use Symfony\Component\HttpFoundation\RequestStack;


class EmailManager
{
private $request;
private $mailer;

public function __construct(RequestStack $requestStack, \Swift_Mailer $mailer)
{
    $this->request = $requestStack->getCurrentRequest();
    $this->mailer  = $mailer;
}

public function sendMail($subject, $recipientName, $recipientEmail, $bodyHtml, $bodyText)
{
    /* @var $mailer \Swift_Mailer */
    if(!$this->mailer->getTransport()->isStarted()){
        $this->mailer->getTransport()->start();
    }

    /* @var $message \Swift_Message */
    $message = $this->mailer->createMessage();
    $message->setSubject($subject);

    $message->setBody($bodyHtml, 'text/html');
    $message->addPart($bodyText, 'text/plain', 'UTF8');

    $message->addTo($recipientEmail, $recipientName);
    $message->setFrom( array('example@gmail.com' => 'Chance') );

    $this->mailer->send($message);
    $this->mailer->getTransport()->stop();
}
}

用于在将电子邮件作为服务投放之前发送电子邮件的原始控制器代码

/**
 * @Route("/", name="contact")
 * @Template("AcmeEmailBundle:Default:index.html.twig")
 */
public function contactAction(Request $request)
{
$form = $this->createForm(new ContactType());

if ($request->isMethod('POST')) {
    $form->submit($request);

    if ($form->isValid()) {
        $message = \Swift_Message::newInstance()
            ->setSubject($form->get('subject')->getData())
            ->setFrom($form->get('email')->getData())
            ->setTo('example@gmail.com')
            ->setBody(
                $this->renderView(
                    'AcmeEmailBundle:Default:index.html.twig',
                    array(
                        'ip' => $request->getClientIp(),
                        'name' => $form->get('name')->getData(),
                        'message' => $form->get('message')->getData()
                    )
                )
            );

        $this->get('mailer')->send($message);

        $request->getSession()->getFlashBag()->add('success', 'Your email has been sent! Thanks!');

        return $this->redirect($this->generateUrl('contact'));
    }
}

return array(
    'form' => $form->createView()
);
}

services.yml

services:
email_manager:
    class: Acme\EmailBundle\Service\EmailManager
    arguments: [@request_stack, @mailer]
    scope: request

1 个答案:

答案 0 :(得分:1)

当您的控制器像这样扩展控制器时

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

//...

/**
 * DemoController
 */
class DemoController extends Controller
{
    // ...

}

您可以访问以下服务:

$emailManager = $this->container->get('email_manager');

然后您可以发送这样的电子邮件:

$emailManager->sendEmail($subject, $recipientName, $recipientEmail, $bodyHtml, $bodyText);

完整概述

1 创建一个电子邮件管理器,它将撰写您的电子邮件并发送给他们

<?php

namespace Acme\EmailBundle\Manager;

//...

/**
 * Composes and Sends emails
 */
class EmailManager 
{
    /**
     * The mailer
     *
     * @var \Swift_Mailer
     */
    protected $mailer;

    /**
     * The email address the mailer will send the emails from
     *
     * @var String
     */
    protected $emailFrom;


    /**
     * @param Request $mailer;
     */
    public function __construct(\Swift_Mailer $mailer, $emailFrom)
    {
        $this->mailer = $mailer;
        $this->emailFrom = $emailFrom;
    }

    /**
     * Compose email
     *
     * @param String $subject
     * @param String $recipientEmail
     * @param String $bodyHtml
     * @return \Swift_Message
     */
    public function composeEmail($subject, $recipientEmail, $bodyHtml)
    {
        /* @var $message \Swift_Message */
        $message = $this->mailer->createMessage();

        $message->setSubject($subject)
                ->setBody($bodyHtml, 'text/html')
                ->setTo($recipientEmail)
                ->setFrom($this->emailFrom);

        return $message;
    }


    /**
     * Send email
     *
     * @param \Swift_Message $message;
     */
    public function sendEmail(\Swift_Message $message)
    {
        if(!$this->mailer->getTransport()->isStarted()){
            $this->mailer->getTransport()->start();
        }

        $this->mailer->send($message);
        $this->mailer->getTransport()->stop();
    }


}

3 将其声明为服务

parameters:
    acme_email.email_from: example@gmail.com

services:
    email_manager:
        class: Acme\EmailBundle\Service\EmailManager
        arguments: [@mailer,%acme_email.email_from%]

4 创建一个处理联系表单的表单处理程序

<?php

namespace Acme\ContactBundle\Form\Handler;

use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\TwigBundle\TwigEngine;
use Acme\EmailBundle\Manager\EmailManager;

/**
 * Handles Contact forms
 */
class ContactFormHandler
{

    /**
     * The request
     *
     * @var Symfony\Component\HttpFoundation\Request;
     */
    protected $request;

    /**
     * The Template Engine
     */
    protected $templating;

    /**
     * The email manager
     */
    protected $emailManager;

    /**
     * @param Request $request;
     * @param TwigEngine $templating
     * @param EmailManager $emailManager
     */
    public function __construct(Request $request, TwigEngine $templating, EmailManager $emailManager)
    {
        $this->request = $request;
        $this->templating =$templating;
        $this->emailManager = $emailManager;

    }

    /**
     * Processes the form with the request
     *
     * @param Form $form
     * @return Email|false 
     */
    public function process(Form $form)
    {
        if ('POST' !== $this->request->getMethod()) {
            return false;
        }

        $form->bind($this->request);

        if ($form->isValid()) {
            return $this->processValidForm($form);
        }

        return false;
    }

    /**
     * Processes the valid form, sends the email
     *
     * @param Form
     * @return EmailInterface The email sent
     */
    public function processValidForm(Form $form)
    {
        /** @var EmailInterface */
        $email = $this->composeEmail($form);

        /** Send Email */
        $this->emailManager->sendEmail($email);

        return $email;
    }

    /**
     * Composes the email from the form
     *
     * @param Form $form
     * @return \Swift_Message
     */
    public function composeEmail(Form $form)
    {
        $subject = $form->get('subject')->getData();
        $recipientEmail = $form->get('email')->getData();
        $bodyHTML = $this->templating->renderView(
                    'AcmeEmailBundle:Default:index.html.twig',
                    array(
                        'ip' => $this->request->getClientIp(),
                        'name' => $form->get('name')->getData(),
                        'message' => $form->get('message')->getData()
                    )
                );                

        /** @var \Swift_Message */
        return $this->emailManager->composeEmail($subject, $recipientEmail, $bodyHTML);
    }

}

3 将其声明为服务:

services:
    acme_contact.contact_form_handler:
        class:     Acme\ContactBundle\FormHandler\ContactFormHandler
        arguments: [@request, @templating, @email_manager]
        scope: request

4 这让你在控制器中变得简短而又甜蜜

/**
 * @Route("/", name="contact")
 * @Template("AcmeContactBundle:Default:index.html.twig")
 */
public function contactAction(Request $request)
{
    /** BTW, you could create a service to create the form too... */
    $form = $this->createForm(new ContactType());
    $formHandler = $this->container->get('acme_contact.contact_form_handler');

    if ($email = $formHandler->process($form)) {
         $this->setFlash('success', 'Your email has been sent! Thanks!');
         return $this->redirect($this->generateUrl('contact'));
     }

}