Php 如何从Symfony2服务类发送电子邮件?

Php 如何从Symfony2服务类发送电子邮件?,php,email,symfony,Php,Email,Symfony,我可以成功地使用以下代码从控制器发送电子邮件: $message = \Swift_Message::newInstance() ->setSubject('Hello Email') ->setFrom('send@example.com') ->setTo('recipient@example.com') ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig',

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

$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);

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

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


另请参见

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

如果您的服务只需要mailer服务而不需要其他服务,我建议只使用mailer服务

以下是如何配置DIC,以使用setter注入邮件服务:

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

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

为什么不注入构造函数?个人偏好。如果这个类只做一件事,那么请确保它是一个构造函数。虽然如果服务做得更多,比如说有构造函数参数、初始化和多个外部依赖项,它可能会很快变得非常混乱。
renderView
从哪里来p@RedactedProfile,这是一个奇妙的观点。您需要注入模板服务(名为“templating”)并从中调用
renderView
。@noetix也一样,我在这里使用的是2.6.1(虽然我认为这是通用的?),但是
renderView
templating
中不存在,这是控制器的快捷方式。然而,它只是
模板化
呈现()
的1:1别名。我之所以提出这个问题,是因为前几天我有点被它绊倒了
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);
    }
}