通过特征设置Mailable标头?

时间:2017-08-17 19:44:04

标签: laravel email header swiftmailer

我正在创建一个可以使用电子邮件受益的Laravel软件包。当用户使用我的包时,他们希望通过电子邮件发送包创建的文件,但也为电子邮件设置一些自定义标题。

在一个理想的解决方案中,我希望开发人员可以在他们的mailable类上简单地use,它会自动设置该电子邮件的标题,而无需任何其他代码。这是否可以通过使用特征来实现?

有些解决方案建议通过将此标记添加到build方法中来添加标题:

$this->withSwiftMessage(function ($message) {
    $headers = $message->getHeaders();
    $headers->addTextHeader('mime', 'text/calendar');
});

但是有没有办法在Mailable的build方法上使用它而不必在Mailable类本身中编写自己的自定义特征?

1 个答案:

答案 0 :(得分:3)

使用特征解决方案

能够使用特征进行此操作的唯一方法是在特征中定义build方法并让用户定义另一个函数而不是build,这样您就可以直接操作Mailable类实际使用的函数。

所以你的特质是:

trait IsMailable {


     public function build()
     {
          $this->withSwiftMessage(function ($message) {
              $headers = $message->getHeaders();
              $headers->addTextHeader('mime', 'text/calendar');
          });

          if(!method_exists($this, 'buildMail')) throw \Exception('buildMail is not defined!');
          return $this->buildMail();
      }



}

因此,您的用户必须定义​​方法buildMail而不是build

最佳解决方案

最佳解决方案IMHO将扩展类Illuminate\Mail\Mailable,重新定义方法send,并使最终用户实现这个新定义的类而不是Illuminate\Mail\Mailable

所以你的课程将是:

class Mailable extends \Illuminate\Mail\Mailable {

    /**
    * Send the message using the given mailer.
    *
    * @param  \Illuminate\Contracts\Mail\Mailer  $mailer
    * @return void
    */
    public function send(MailerContract $mailer)
    {
        $this->withSwiftMessage(function ($message) {
            $headers = $message->getHeaders();
            $headers->addTextHeader('mime', 'text/calendar');
        });

        parent::send($mailer);
    }
}

这样做,您的用户可以像使用标准build类一样使用Illuminate\Mail\Mailable方法,但最终结果是您的类正在捎带您实际需要的其他信息。