本文目录导读:

- 使用
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邮件模板中传递和使用各种变量。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播