9

我可以成功使用以下代码从控制器发送电子邮件:

$message = \Swift_Message::newInstance()
    ->setSubject('Hello Email')
    ->setFrom('send@example.com')
    ->setTo('recipient@example.com')
    ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name)))
;
$this->get('mailer')->send($message);

我必须如何修改代码才能从服务类中使用它?

4

2 回答 2

11

您的服务具有外部依赖性,尤其是邮件服务。您可以注入服务容器本身,也可以注入邮件服务。

如果您的服务只需要邮件服务而不需要其他服务,我建议只注入邮件服务。

以下是配置 DIC 以使用 setter 注入邮件服务的方法:

<service id="my.service" class="Acme\DemoBundle\Service\Hello">
    <call method="setMailer">
        <argument type="service" id="mailer" />
    </call>
</service>

在您的班级中,编写您的二传手:

class Hello
{
    protected $mailer;

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

    public function sendEmail()
    {
        $message = \Swift_Message::newInstance()
            ->setSubject('Hello Email')
            ->setFrom('send@example.com')
            ->setTo('recipient@example.com')
            ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name)))
        ;
        $this->mailer->send($message);
    }
}

注意:您必须在控制器中渲染模板并传递给此电子邮件功能,或者注入模板服务并在您的服务中渲染。

于 2012-10-18T22:26:08.880 回答
2

这取决于您如何声明服务。如果您将整个服务容器传递给它,则无需更改任何内容,否则您至少需要将邮件和模板服务传递给它并更直接地调用($this->get('service')将导致致命错误,因为它取决于container

另请参阅https://stackoverflow.com/a/12905319/258674

于 2012-10-18T22:12:58.113 回答