使用 Laravel Mailable 简化电子邮件处理
Laravel Mailable 提供了一种富有表现力的、面向对象的方法以在应用中编写电子邮件。该特性简化了创建和发送电子邮件的过程,使代码更具可读性和可维护性。让我们探讨一下如何在 Laravel 项目中有效地利用 Mailables。
新建一个 Mailable 类
要创建新的 Mailable,请使用 Laravel 的 Artisan 命令:
php artisan make:mail OrderShipped
这就生成了一个新的 Mailable 类:
use Illuminate\Mail\Mailable;
class OrderShipped extends Mailable
{
public function build()
{
return $this->view('emails.orders.shipped');
}
}
将数据添加到你的 Mailable 中
你可以轻松地将数据传递到电子邮件模板:
class OrderShipped extends Mailable
{
public $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function build()
{
return $this->view('emails.orders.shipped');
}
}
Mailable 上的公开属性将在视图中自动可用。
使用 Markdown 作为 Email 模板
Laravel 支持使用 Markdown 作为 Email 模板,使之易于编写及维护:
public function build()
{
return $this->markdown('emails.orders.shipped');
}
要新建一个 Markdown 模板:
php artisan make:mail OrderShipped --markdown=emails.orders.shipped
自定义发送者
你可用轻松地自定义右键的发送者:
public function build()
{
return $this->from('sales@example.com')
->markdown('emails.orders.shipped');
}
添加附件
向邮件中添加附件也很简单:
public function build()
{
return $this->markdown('emails.orders.shipped')
->attach('/path/to/file');
}
邮件队列
为了获得更好的性能,你可以将电子邮件进入队列:
Mail::to($user)->queue(new OrderShipped($order));
请确保 Mailable 类实现 ShouldQueue
:
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Mailable implements ShouldQueue
{
// ...
}
测试 Mailable
Laravel 使得测试 Mailable 变得轻松:
use App\Mail\OrderShipped;
use App\Models\Order;
public function test_order_shipped_email()
{
$order = Order::factory()->create();
$mailable = new OrderShipped($order);
$mailable->assertSeeInHtml($order->number);
$mailable->assertSeeInText('Thank you for your order');
}
真实示例
此处是更复杂的 Mailable 示例:
class InvoicePaid extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $invoice;
public function __construct(Invoice $invoice)
{
$this->invoice = $invoice;
}
public function build()
{
return $this->markdown('emails.invoices.paid')
->subject('Invoice Paid')
->with([
'url' => route('invoices.show', $this->invoice),
'amount' => $this->invoice->amount,
])
->attach($this->invoice->pdf_path, [
'as' => 'invoice.pdf',
'mime' => 'application/pdf',
]);
}
}
Laravel Mailable 提供了一种简洁、富有表现力的方式来处理应用中的电子邮件生成和发送。通过将电子邮件逻辑封装在专用类中,可以为电子邮件功能创建更可维护和可测试的代码。