如何在Laravel Mailable模板中修改Header Logo并正确传递自定义变量
问题解决方法
核心错误原因
- Mailable类的
__construct方法不需要返回值,你写在构造里的return $this->markdown()完全无效,邮件的模板配置要写在build方法内 - 你在
build方法直接返回header子视图是错误的,header是整套邮件模板的嵌套组件,你单独给它传参不会在全局邮件渲染时生效,自然会报变量未定义
正确实现步骤
1. 修正ContactMail.php代码
Mailable的公共属性会自动传递到所有关联的邮件视图、子组件中,不需要手动with传参给子视图:
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class ContactMail extends Mailable implements ShouldQueue { use Queueable, SerializesModels; // 定义为公共属性,所有邮件相关视图都可直接访问 public $content; public function __construct() { // 建议用asset生成完整URL,避免邮件客户端无法加载相对路径图片 $this->content = asset("storage/hg5zkMDJTAWaIjc8hH5jqtb5FGmOXfpccha2k0A4.png"); } public function build() { // 这里返回你自定义的主邮件markdown模板即可 return $this->markdown('emails.contact'); } }
2. 修正header.blade.php代码
注意给img的src属性加引号,避免解析错误:
<tr> <td class="header"> <a href="{{ $url }}" style="display: inline-block;"> <img src="{{ $content }}" class="logo" alt="Logo"> </a> </td> </tr>
如果需要兼容其他邮件的默认logo,可以加个存在性判断:
<tr> <td class="header"> <a href="{{ $url }}" style="display: inline-block;"> @isset($content) <img src="{{ $content }}" class="logo" alt="Logo"> @elseif (trim($slot) === 'Laravel') <img src="https://laravel.com/img/notification-logo.png" class="logo" alt="Laravel Logo"> @else {{ $slot }} @endif </a> </td> </tr>
3. 测试验证
现在你Controller里的test方法直接返回ContactMail实例即可正常预览,变量会自动生效。如果是实际发送邮件,调用Mail::to($address)->send(new ContactMail())即可。
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

