本文目录导读:

- 使用
with()方法传递变量 - 在邮件模板中使用变量
- 使用
Mailable类继承方式传递 - 使用
Mail::send直接传递 - 使用全局变量(不推荐但可用)
- 传递复杂数据示例
- 使用
View::share全局共享(谨慎使用) - 最佳实践建议
- 注意事项
在Laravel中传递变量到邮件模板有多种方式,下面是详细的实现方法:
使用with()方法传递变量
基本用法
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class WelcomeMail extends Mailable
{
use Queueable, SerializesModels;
public $user;
public $order;
private $secretData;
public function __construct($user, $order, $secretData)
{
$this->user = $user;
$this->order = $order;
$this->secretData = $secretData; // 私有属性不会自动传递到视图
}
public function build()
{
return $this->view('emails.welcome')
->with([
'user' => $this->user,
'order' => $this->order,
'extraData' => '额外数据'
]);
}
}
在控制器中使用
<?php
namespace App\Http\Controllers;
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;
class UserController extends Controller
{
public function sendWelcomeEmail($userId)
{
$user = User::find($userId);
$order = $user->orders()->latest()->first();
// 方式1:传递构造参数
Mail::to($user->email)->send(new WelcomeMail($user, $order, '秘密数据'));
// 方式2:使用with修改数据
$mail = new WelcomeMail($user, $order, '秘密数据');
$mail->with([
'additionalData' => '这是额外数据',
'timestamp' => now()
]);
Mail::send($mail);
return response()->json(['message' => '邮件发送成功']);
}
}
在邮件模板中使用变量
创建邮件模板 resources/views/emails/welcome.blade.php
<!DOCTYPE html>
<html>
<head>欢迎邮件</title>
</head>
<body>
<h1>您好,{{ $user->name }}!</h1>
<p>欢迎加入我们的平台!您的订单信息如下:</p>
<table>
<tr>
<td>订单号:</td>
<td>{{ $order->order_number }}</td>
</tr>
<tr>
<td>订单金额:</td>
<td>¥{{ number_format($order->amount, 2) }}</td>
</tr>
<tr>
<td>订单状态:</td>
<td>{{ $order->status }}</td>
</tr>
</table>
<p>额外信息:{{ $extraData ?? '无' }}</p>
<p>时间戳:{{ $timestamp ?? now()->format('Y-m-d H:i:s') }}</p>
@if(isset($additionalData))
<p>附加数据:{{ $additionalData }}</p>
@endif
</body>
</html>
使用Mailable类继承方式传递
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class CustomMail extends Mailable
{
use Queueable, SerializesModels;
public $data;
public function __construct($data = [])
{
$this->data = $data;
}
public function build()
{
return $this->from(config('mail.from.address'), config('mail.from.name'))
->subject('自定义主题')
->view('emails.custom')
->with($this->data);
}
}
使用Mail::send直接传递
use Illuminate\Support\Facades\Mail;
// 方式1:使用数组传递
Mail::send('emails.welcome',
['user' => $user, 'order' => $order],
function ($message) use ($user) {
$message->to($user->email)
->subject('欢迎邮件')
->from(config('mail.from.address'));
}
);
// 方式2:使用Mailables
Mail::to($user->email)->send(new WelcomeMail($user, $order));
使用全局变量(不推荐但可用)
{{-- email.blade.php --}}
<p>用户名称:{{ $GLOBALS['user']->name ?? '未知' }}</p>
传递复杂数据示例
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class ReportMail extends Mailable
{
use Queueable, SerializesModels;
public $reportData;
public $summary;
public function __construct($reportData)
{
$this->reportData = $reportData;
$this->summary = $this->generateSummary();
}
private function generateSummary()
{
return [
'total_sales' => array_sum(array_column($this->reportData, 'amount')),
'total_orders' => count($this->reportData),
'generated_at' => now()
];
}
public function build()
{
return $this->view('emails.report')
->with([
'summary' => $this->summary,
'data' => $this->reportData,
'manager' => auth()->user() ?? null
]);
}
}
使用View::share全局共享(谨慎使用)
// AppServiceProvider.php
use Illuminate\Support\Facades\View;
public function boot()
{
View::share('app_name', config('app.name'));
View::share('company_address', 'XX市XX区XX路');
}
最佳实践建议
使用专门的邮件类配合数据传递
// app/Mail/OrderConfirmation.php
class OrderConfirmation extends Mailable
{
use Queueable, SerializesModels;
public $order;
public $items;
public $totalAmount;
public function __construct($order)
{
$this->order = $order;
$this->items = $order->items()->get();
$this->totalAmount = $this->items->sum(function($item) {
return $item->price * $item->quantity;
});
}
public function build()
{
return $this->subject("订单确认 - {$this->order->order_number}")
->view('emails.order-confirmation');
}
}
// 控制器中使用
public function sendOrderConfirmation($orderId)
{
$order = Order::find($orderId);
Mail::to($order->customer_email)
->queue(new OrderConfirmation($order)); // 使用队列异步发送
return back()->with('success', '订单确认邮件已发送');
}
注意事项
- 数据保护:敏感数据不要直接传递到视图,可以使用私有属性
- 数据验证:在模板中使用 运算符处理可能不存在的变量
- 性能考虑:对于大量邮件,使用队列:
Mail::queue() - 调试:本地开发可使用
Mail::fake()或Mail::failures()调试
通过以上方式,你可以灵活地在Laravel邮件模板中传递和使用各种变量。