我正在创建一个可以使用电子邮件受益的Laravel软件包。当用户使用我的包时,他们希望通过电子邮件发送包创建的文件,但也为电子邮件设置一些自定义标题。
在一个理想的解决方案中,我希望开发人员可以在他们的mailable类上简单地use
,它会自动设置该电子邮件的标题,而无需任何其他代码。这是否可以通过使用特征来实现?
有些解决方案建议通过将此标记添加到build
方法中来添加标题:
$this->withSwiftMessage(function ($message) {
$headers = $message->getHeaders();
$headers->addTextHeader('mime', 'text/calendar');
});
但是有没有办法在Mailable的build
方法上使用它而不必在Mailable类本身中编写自己的自定义特征?
答案 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
方法,但最终结果是您的类正在捎带您实际需要的其他信息。