在Symfony中创建一个邮件服务

5

我试图在我的Symfony Sonata bundle中创建一个服务,以便在订单创建后立即向特定的人发送电子邮件。接收电子邮件的人是用户选择批准订单的人。

我试图遵循Symfony网站上服务容器文档,但对我来说感觉不够完整。我想看到一个完整的示例,而不仅仅是一些片段。

这是我迄今为止的电子邮件服务类;

<?php

namespace Qi\Bss\BaseBundle\Lib\PurchaseModule;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Doctrine\ORM\EntityManager;

/**
 * 
 */
class Notifier 
{
    /**
     * Service container
     * @var type 
     */
    private $serviceContainer;


    public function notifier($subject, $from, $to, $body) {
        $message = \Swift_Message::newInstance()
            ->setSubject($subject)
            ->setFrom($from)
            ->setTo($to)
            ->setBody($body)
        ;
        $this->serviceContainer->get('mailer')->send($message);
    }

    /**
     * Sets the sales order exporter object
     * @param type $serviceContainer
     */
    public function setServiceContainer($serviceContainer)
    {
        $this->serviceContainer = $serviceContainer;
    }
}

我的services.yml文件中的服务如下所示:

bss.pmod.order_notifier:
    class: Qi\Bss\BaseBundle\Lib\PurchaseModule\Notifier
    arguments: ["@mailer"]

当我在控制器操作中调用服务时,我使用这行代码;

$this->get('bss.pmod.order_notifier')->notifier();

我遇到的错误是;

注意:未定义属性: Qi\Bss\FrontendBundle\Controller\PmodOrderController::$serviceContainer

就像我之前所说的,我已经查看了服务容器文档,但我无法理解它。

有人可以帮我提供一个详细的示例来解释一切吗?

1个回答

4

在你的服务类中不需要使用setServiceContainer方法,相反你应该有一个接受邮件发送器作为第一个参数的__construct构造函数:

class Notifier 
{
    protected $mailer;

    public function __construct($mailer)
    {
        $this->mailer = $mailer;
    }

    public function notifier() {
        $message = \Swift_Message::newInstance()
            ->setSubject('Simon Koning')
            ->setFrom('noreply@solcon.nl')
            ->setTo('simon@simonkoning.co.za')
            ->setBody('The quick brown fox jumps over the lazy dog.')
        ;
        $this->mailer->send($message);
    }
}

非常感谢!现在我终于明白文档中发生了什么。有些傻傻的东西我一开始看不到,然后事后感觉自己很愚蠢。谢谢! - Jack Coolen
3
现在你已经完成了这一步,下一个阶段可能是构建一个事件监听器,并使控制器在创建订单时发送事件。然后,监听器可以负责发送电子邮件以及在创建订单时需要执行的任何其他操作。这将简化您的控制器并帮助隔离业务逻辑。当然,这不是必需的,但值得考虑。 - Cerad
1
现在,您可以向构造函数添加另一个依赖项,例如 @templating,以便能够发送 HTML 电子邮件。 - Kamil Adryjanek
@KamilAdryjanek 这正是我接下来想要做的事情。我现在有一个很好的想法。 - Jack Coolen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接