PHP项目Laravel邮件模板变量传递

wen PHP项目 3

本文目录导读:

PHP项目Laravel邮件模板变量传递

  1. 使用with()方法传递变量
  2. 在邮件模板中使用变量
  3. 使用Mailable类继承方式传递
  4. 使用Mail::send直接传递
  5. 使用全局变量(不推荐但可用)
  6. 传递复杂数据示例
  7. 使用View::share全局共享(谨慎使用)
  8. 最佳实践建议
  9. 注意事项

在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', '订单确认邮件已发送');
}

注意事项

  1. 数据保护:敏感数据不要直接传递到视图,可以使用私有属性
  2. 数据验证:在模板中使用 运算符处理可能不存在的变量
  3. 性能考虑:对于大量邮件,使用队列:Mail::queue()
  4. 调试:本地开发可使用 Mail::fake()Mail::failures() 调试

通过以上方式,你可以灵活地在Laravel邮件模板中传递和使用各种变量。

抱歉,评论功能暂时关闭!