【问题标题】:Create an email service in Symfony在 Symfony 中创建电子邮件服务
【发布时间】:2016-08-11 12:32:09
【问题描述】:

我尝试在我的 Symfony Sonata 捆绑包中提供一项服务,以便在创建订单后立即向特定人员发送电子邮件。接收电子邮件的人是用户选择批准订单的人。

我尝试关注service container documentation on Symfony's website,但对我来说感觉太不完整了。我想看一个完整的例子,而不仅仅是几个 sn-ps。

这是我目前为止的电子邮件服务课程;

<?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

就像我之前说的,我看过service container documentation,但我看不懂。

有人可以帮我举一个很好的完整例子来解释一切吗?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    您的服务类中不需要 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);
        }
    }
    

    【讨论】:

    • 非常感谢!现在我终于看到文档中发生了什么。一些我一开始看不到的愚蠢的东西,然后我觉得很愚蠢。谢谢!
    • 现在您已通过此步骤,下一阶段可能是构建一个事件侦听器,并让您的控制器在创建订单时发送一个事件。然后,侦听器可以负责发送电子邮件以及执行创建订单时可能需要完成的任何其他事情。这简化了您的控制器并有助于隔离您的业务逻辑。当然不是必需的,但需要考虑,
    • 现在您可以向构造函数添加另一个依赖项:@templating 以便能够发送 HTML 电子邮件。
    • @KamilAdryjanek 这正是我接下来要做的。我现在有个不错的主意。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 2020-11-27
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2011-11-16
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多