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目录,可以修改布局文件,显式传递变量到子视图:
- 打开
resources/views/vendor/mail/html/layout.blade.php,找到引入header的代码,修改为:
@include('vendor.mail.html.header', ['logoUrl' => $logoUrl])
- 在通知类的
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实例,这种方式对变量传递的控制更直接:
- 创建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模板 } }
- 修改通知类的
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
相关产品推荐
相关产品推荐

