【问题标题】:How can I send emails from a Symfony2 service class?如何从 Symfony2 服务类发送电子邮件?
【发布时间】:2012-10-09 11:35:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: php email symfony


    【解决方案1】:

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

    另见https://stackoverflow.com/a/12905319/258674

    【讨论】:

      【解决方案2】:

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

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

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

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

      在您的班级中,编写您的 setter:

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

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

      【讨论】:

      • 为什么不注入构造函数?
      • 个人喜好。如果这个类只做这件事,那么确定,让它成为一个构造函数。虽然如果服务做得更多,比如有构造函数参数、初始化和多个外部依赖项,它很快就会变得非常混乱。
      • renderView 是从哪里来的? :p
      • @RedactedProfile,这是一个很棒的观点。您需要注入模板服务(名为“模板”)并从中调用renderView
      • @noetix 也可以,并且请记住我在这里使用 2.6.1(尽管我认为这是通用的?),但 renderView 不存在于 Templating 中,这是一个控制器快捷方式。但是,这只是 templatingrender() 的 1:1 别名,哈哈,我之所以提出这个只是因为前几天这让我有点不适应 ?
      猜你喜欢
      • 2017-08-05
      • 2011-01-26
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多