Laravel通知中如何传递自定义变量以动态修改邮件头部Logo?
Laravel通知中如何传递自定义变量以动态修改邮件头部Logo?
嘿,这个需求我之前做项目的时候刚好碰到过,其实核心就是把Logo的相关变量从通知类传递到邮件视图里,给你分步骤捋一捋具体怎么实现:
第一步:在通知类中定义并传递Logo变量
首先在你的通知类里,通过构造函数接收Logo的地址(或者base64编码内容,看你实际需求),把它存为类的属性,这样后续发邮件的方法就能直接调用。比如:class InvoiceNotification extends Notification { protected $emailContent; protected $logoInfo; // 定义存储Logo信息的属性 // 构造函数接收业务内容和Logo参数 public function __construct($emailContent, $logoInfo) { $this->emailContent = $emailContent; $this->logoInfo = $logoInfo; } // 指定通知渠道为邮件 public function via($notifiable) { return ['mail']; } }第二步:在toMail方法中把变量传递到邮件视图
接下来在toMail方法里,有两种常见实现方式,根据你是否要自定义全量邮件模板来选:方式一:使用完全自定义的邮件模板
如果你想自己掌控整个邮件的样式结构,就用view方法指定你的blade模板,同时把Logo变量和其他内容一起传进去:public function toMail($notifiable) { return (new MailMessage) ->subject($this->emailContent['subject']) // 关联自定义模板并传递变量 ->view( 'emails.custom-invoice', [ 'logoInfo' => $this->logoInfo, 'emailBody' => $this->emailContent['email_body'], 'payActionUrl' => url('/'), 'thankYouText' => 'Thank you for using our application!' ] ) ->attachData(base64_decode($yourAttachmentData), 'invoice-detail.pdf'); // 你的附件逻辑 }然后在
resources/views/emails/custom-invoice.blade.php模板里,直接用变量渲染Logo:<div class="email-header"> <!-- 如果是URL直接用src,是base64就拼接data URI --> <img src="{{ is_string($logoInfo) ? $logoInfo : 'data:image/png;base64,'.$logoInfo }}" alt="Brand Logo" style="height: 50px;"> </div> <!-- 其他邮件内容渲染 --> <div class="email-content">{!! $emailBody !!}</div>方式二:复用Laravel默认邮件组件(仅替换头部Logo)
要是不想全量自定义,只想改默认模板的头部Logo,可以先发布Laravel的邮件视图资源:php artisan vendor:publish --tag=laravel-mail找到
resources/views/vendor/mail/html/header.blade.php,修改组件逻辑支持接收Logo变量:@component('mail::header', ['url' => config('app.url')]) <img src="{{ $logoInfo }}" alt="{{ config('app.name') }} Logo" style="height: 40px;"> @endcomponent然后在通知类的
toMail方法里,用with把Logo变量共享到视图中:public function toMail($notifiable) { return (new MailMessage) ->subject($this->emailContent['subject']) ->line(new HtmlString($this->emailContent['email_body'])) ->action('Pay Invoice', url('/')) ->line('Thank you for using our application!') ->with(['logoInfo' => $this->logoInfo]) // 共享Logo变量到邮件视图 ->attachData(base64_decode($yourAttachmentData), 'attachment.pdf'); }第三步:触发通知时传入动态Logo参数
最后在控制器或者业务逻辑里触发通知时,把对应场景的Logo信息传进去就行:// 比如从配置或数据库取动态Logo地址 $dynamicLogo = 'https://your-brand.com/seasonal-logo.png'; // 或者base64编码的图片内容 // $dynamicLogo = base64_encode(file_get_contents(storage_path('app/logos/custom.png'))); $user->notify(new InvoiceNotification($emailContent, $dynamicLogo));
这样就能根据不同业务场景动态替换邮件头部的Logo啦,操作起来没什么复杂的~
内容来源于stack exchange
相关产品推荐
相关产品推荐

