Symfony2 - 将 Swiftmailer 添加为服务

2024-05-19

我想将我的电子邮件代码从我的控制器移至服务中。

到目前为止我已完成以下操作:

  • 在 services.yml 中创建条目

  • 在 acme/demobundle/services/EmailManager.php 中创建了一个 EmailManager.php 文件

可以使用一些帮助来了解需要进入 EmailManager.php 的内容以及如何在控制器中调用它吗?

服务.yml

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

电子邮件管理器.php

<?php
// src/Acme/DemoBundle/Services/EmailManager.php

namespace Acme\DemoBundle\Services;

class EmailManager
{
private $mailer;
private $request;

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

What needs to go here? Do I just copy/paste the code from the contactAction below into here?

}

我想将带有 contactAction 的控制器代码从控制器移至 EmailManager 服务中:

/**
 * @Route("/", name="contact")
 * @Template("AcmeDemoBundle: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('[email protected] /cdn-cgi/l/email-protection')
            ->setBody(
                $this->renderView(
                    'AcmeDemoBundle: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()
);
}

联系方式表格

class ContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('name', 'text', array(
    'attr' => array(
        'placeholder' => 'What\'s your name?',
        'pattern'     => '.{2,}' //minlength
    )
))
    ->add('email', 'email', array(
        'attr' => array(
            'placeholder' => 'So I can get back to you.'
        )
    ))
    ->add('subject', 'text', array(
        'attr' => array(
            'placeholder' => 'The subject of your message.',
            'pattern'     => '.{3,}' //minlength
        )
    ))
    ->add('message', 'textarea', array(
        'attr' => array(
            'cols' => 90,
            'rows' => 10,
            'placeholder' => 'And your message to me...'
        )
    ));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $collectionConstraint = new Collection(array(
        'name' => array(
            new NotBlank(array('message' => 'Name should not be blank.')),
            new Length(array('min' => 2))
        ),
        'email' => array(
            new NotBlank(array('message' => 'Email should not be blank.')),
            new Email(array('message' => 'Invalid email address.'))
        ),
        'subject' => array(
            new NotBlank(array('message' => 'Subject should not be blank.')),
            new Length(array('min' => 3))
        ),
        'message' => array(
            new NotBlank(array('message' => 'Message should not be blank.')),
            new Length(array('min' => 5))
        )
    ));

    $resolver->setDefaults(array(
        'constraints' => $collectionConstraint
    ));
}

public function getName()
{
    return 'contact';
}
}

您可以根据需要进行自定义,但这是一个总体思路和一个非常快速的草稿来指导您:

public function send($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('[email protected] /cdn-cgi/l/email-protection' => 'Chance') );

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

改进空间

你可以有:

  • An email data model这将包含电子邮件所需的字段(例如$subject, $recipientEmail, ...)
  • A composer这将根据您的请求撰写您的电子邮件
  • A sender这会发送您的电子邮件

EMAIL MODEL would look something like this:

/**
 * Email Data Model
 */
class Email implements EmailInterface
{
    /**
     * The text part of the message.
     *
     * @var string
     */
    protected $bodyText;

    // etc...etc..

}

You'd have an EmailInterface too:

/**
 * Email interface
 */
interface EmailInterface
{

    /**
     * @return string
     */
    public function getBodyText();

    // etc...etc..

}

THE SENDER would look like this (if kept inside EmailManager):

public function send(EmailInterface $email)
{
    //...
}

THE COMPOSER would look like this (if kept inside EmailManager):

public function composeEmail(Request $request)
{
    //...

    return $email;
}

Note:Composer 和 Sender 也可以是一个单独的服务,以便更好地重用,我想这取决于您。如果你的程序中只有函数的话,它们会是这样的:电子邮件管理器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2 - 将 Swiftmailer 添加为服务 的相关文章

  • 如何将 Ajax 与 Symfony2 集成 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找有关 symfony2 中
  • 使用 jQuery 和 AJAX 跨域 PHP 调用

    我遇到一个问题 我使用的服务器未配置为允许 PHP 或 CGI 并且我需要使用从该服务器上的表单收到的变量向所有者发送邮件 例如一般查询 反馈表单 有谁知道我如何在配置为使用 PHP 的另一个域上调用一个简单的 PHP 文件 然后执行mai
  • 我无法使用 Codeigniter 发送任何电子邮件

    我创建了一个控制器 并在控制器中做了一个测试函数来测试电子邮件是否发送 我检查了不同的电子邮件地址 但没有成功 这是我的代码示例 public function sendmail config protocol sendmail confi
  • 按按钮,启动带有附件的本机电子邮件程序(位于网络服务器上)

    我已经尝试了所有不同版本的发送电子邮件 但尚未实现以下目标 Javascript 或 HTML 按钮 按下时打开带有附件的本机邮件应用程序 附件与网页位于同一服务器上 例如 web www something com file www so
  • 下订单时如何在 Magento 中触发电子邮件?

    我需要以下问题的解决方案 1 客户下订单 2 店主收到没有价格信息的电子邮件 例如装箱单 我需要编辑哪些文件 我读过很多帖子 但他们似乎没有提到文件路径 Thx 实现这一目标的两种可能方法 您可以为该类创建模型重写Mage Sales Mo
  • FOSUserBundle 和 ACL 业务角色

    这个周末我开始学习 Symfony 2 我没有遇到任何问题 因为我认为该框架有详细记录 我正在使用 FOSUserBundle 包进行 ACL 我想知道是否可以使其类似于 Yii 框架 bizRule return Yii app gt u
  • 作曲家创建项目 symfony/骨骼 new_project“4.0”

    它安装 Symfony 4 1 3 内核 src 环境 dev 调试 true 如何让它准确安装 4 0 composer create project symfony skeleton new project 4 0 Installing
  • Symfony Finder 忽略以点开头的文件

    我使用 Finder 发送假脱机电子邮件 但自动名称生成器会在文件名中添加点 有时它们会出现在文件的开头 似乎查找器无法获取具有该名称的文件 那么这些文件是隐藏的 有人经历过这种行为吗 有什么建议如何使用查找器来查找隐藏文件吗 Thx 刚刚
  • 编辑表单以清理/验证电话号码

    我对 PHP 的经验非常有限 我真的希望有人可以帮助我 我想要做的是清理 验证输入的电话号码 以便只允许使用数字 我想我需要使用FILTER SANITIZE NUMBER INT但我不确定在哪里或如何使用它 这是我的代码
  • 如何使用symfony2中的findOneBy方法返回数组而不是对象?

    我有一种情况 我想使用 symfony2 中的 findOneBy id 方法查询数据库 namePosting this gt getDoctrine gt getRepository MyBundle Users gt findOneB
  • 在 Django 1.7 中使用 html 发送电子邮件

    In 发送邮件 我们有一个新参数 html message Docs https docs djangoproject com en dev topics email send mail I have 电子邮件 html文件 我想发送我的消
  • 使用 gmail smtp 服务器时如何更改发件人地址

    我想从以下地址发送电子邮件A to B with HEADER and CONTENT通过 Gmail 如何通过 PHP 做到这一点 我已经指定了FROM email protected cdn cgi l email protection
  • PHP:使用西里尔字母发送电子邮件(乌克兰语文本)

    使用 PHP 发送西里尔字母电子邮件时出现问题 我这边 服务器 IIS 数据库 MsSQL 电子邮件服务器 Exchange 2010 通过 PHP EWS 进行通信 Receiver 是一家政府拥有的公司 拥有用于接收电子邮件的特定软件
  • Exchange 服务器不接受 javax.mail API 提供的用户名/密码

    我有一个可爱的小型 Java 客户端 可以发送签名的电子邮件 我们有一个需要用户名 密码身份验证才能发送消息的 Exchange 服务器 当我连接到交换服务器时 出现以下错误 avax mail AuthenticationFailedEx
  • 如何发送电子邮件而不进入垃圾邮件

    MailAddress mailFrom new MailAddress email protected cdn cgi l email protection MailAddress mailTo new MailAddress email
  • 重置密码 电子邮件

    我是 Laravel 开发新手 目前正在从事小型项目 我想自定义重置密码的电子邮件模板 甚至将其链接到完全不同的模板 对于身份验证脚手架 我使用了php artisan make auth命令 但是 默认重置密码功能使用默认的 Larave
  • 使用自定义服务的编译器传递加载 Symfony 的参数

    根据这个问题如何从数据库加载 Symfony 的配置参数 Doctrine https stackoverflow com q 28713495 8945214我有一个类似的问题 我需要动态设置参数 并且我想提供来自另一个自定义服务的数据
  • 尝试使用 swift mailer、gmail smtp、php 发送邮件

    这是我的代码
  • 电子邮件地址是 URI 吗?

    我试图弄清楚电子邮件地址的格式是否可以说符合 URI 的定义 但到目前为止我还没有发现对此的明确确认 我希望有人可以在这里为我提供一些见解 提前致谢 是的 但带有 mailto 前缀 URI 具有以下形式
  • 从前台服务的活动中释放内存

    我有一个带有前台服务和一项活动的应用程序 该服务可以在启动时自行启动 也可以从 Activity 中启动 我注意到当服务在启动时自行启动时 内存使用量约为 3MB 一旦我打开该 Activity 内存使用量就会跃升至约 9mB 一旦 Act

随机推荐