You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 7通知类邮件模板传递自定义数据问题

在Laravel 7中向邮件模板传递自定义变量(logoUrl)的可行方案

针对你使用Laravel Notification + MailMessage发送邮件时,无法将$logoUrl传递到resources/views/vendor/mail/html/header.blade.php和message.blade.php的问题,下面是几种可行的解决方法:

方法一:视图全局共享变量

直接在通知类的toMail方法里,用View::share把logoUrl共享给所有视图,邮件模板就能直接调用该变量:

// app/Notifications/EntitiesEmail.php
use Illuminate\Support\Facades\View;

public function toMail($notifiable)
{
    $logoUrl = '你的Logo完整地址';
    // 全局共享变量,所有视图都能访问
    View::share('logoUrl', $logoUrl);

    return (new MailMessage)
        ->subject('你的邮件主题')
        ->line('邮件内容')
        ->markdown('vendor.mail.html.message'); // 对应你的自定义模板
}

之后在header.blade.php和message.blade.php里直接用{{ $logoUrl }}即可调用。

方法二:通过自定义邮件模板层级传递变量

如果你已经将Laravel的邮件模板发布到resources/views/vendor/mail目录,可以修改布局文件,显式传递变量到子视图:

  1. 打开resources/views/vendor/mail/html/layout.blade.php,找到引入header的代码,修改为:
@include('vendor.mail.html.header', ['logoUrl' => $logoUrl])
  1. 在通知类的toMail方法里,传递变量到模板:
// app/Notifications/EntitiesEmail.php
public function toMail($notifiable)
{
    $logoUrl = '你的Logo完整地址';

    return (new MailMessage)
        ->subject('你的邮件主题')
        ->line('邮件内容')
        ->markdown('vendor.mail.html.message', ['logoUrl' => $logoUrl]);
}

这样header.blade.php就能通过{{ $logoUrl }}访问变量,message.blade.php本身也能直接调用该变量。

方法三:改用Mailable类(更灵活)

放弃MailMessage,直接在Notification里返回自定义Mailable实例,这种方式对变量传递的控制更直接:

  1. 创建Mailable类:
// app/Mail/EntitiesEmailMailable.php
namespace App\Mail;

use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class EntitiesEmailMailable extends Mailable
{
    use SerializesModels;

    // 公共属性会自动传递到视图
    public $logoUrl;

    public function __construct($logoUrl)
    {
        $this->logoUrl = $logoUrl;
    }

    public function build()
    {
        return $this->subject('你的邮件主题')
            ->view('vendor.mail.html.message'); // 或用markdown()方法指定Markdown模板
    }
}
  1. 修改通知类的toMail方法:
// app/Notifications/EntitiesEmail.php
use App\Mail\EntitiesEmailMailable;

public function toMail($notifiable)
{
    $logoUrl = '你的Logo完整地址';
    return new EntitiesEmailMailable($logoUrl);
}

之后模板里直接用{{ $logoUrl }}即可,无需额外配置。

补充说明

你之前遇到的问题:

  • 用with()方法时数据被额外输出:是因为默认的Laravel通知模板会把with()传递的变量渲染成额外的内容块,而自定义模板如果保留了默认的渲染逻辑,就会显示出来。
  • 用markdown()传递变量无法访问:是因为变量只传递给了message.blade.php,而header.blade.php是被布局文件引入的,布局文件没有接收到该变量,导致无法访问。

内容的提问来源于stack exchange,提问作者Raj Makedreams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:35:31