如何向Laravel Jetstream团队邀请邮件传递额外信息并正确调用自定义字段
问题解决步骤
- 第一步:检查
TeamInvitation邮件类的参数传递
打开app/Mail/TeamInvitation.php,确认构造方法里将完整的$invitation实例传递给了视图,正确写法参考:
namespace App\Mail; use App\Models\TeamInvitation as TeamInvitationModel; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class TeamInvitation extends Mailable { use Queueable, SerializesModels; // 需保证$invitation为public属性,或在build方法中手动传给视图 public function __construct(public TeamInvitationModel $invitation, public string $acceptUrl) { } public function build() { return $this->markdown('emails.team-invitation'); } }
如果此前仅单独抽取部分字段传给视图、没有传递完整的$invitation实例,模板中自然取不到existing_user字段。
- 第二步:虚拟字段需追加到模型序列化列表
如果existing_user不是数据库物理字段,是通过模型访问器计算生成的虚拟字段,需要在app/Models/TeamInvitation.php中加入$appends配置:
class TeamInvitation extends Model { protected $appends = ['existing_user']; // 你的existing_user访问器逻辑示例 public function getExistingUserAttribute() { return User::where('email', $this->email)->exists(); } }
未添加$appends的情况下,虚拟字段不会自动随模型实例传递给视图。
- 第三步:重启队列进程
如果你开启了队列发送邮件,修改代码后必须重启队列进程,否则旧的队列进程仍然运行修改前的代码,不会加载新增的字段逻辑:
php artisan queue:restart
第四步:确认字段值已持久化
如果你是在创建邀请记录后临时给$invitation赋值existing_user,没有调用save()方法存入数据库,发邮件时如果重新从数据库查询了邀请记录,临时赋值就会丢失,需要把existing_user存入数据库对应字段,或者发送邮件前直接将值传递给邮件类。第五步:确认修改的是生效模板
如果你已经发布过Jetstream的视图文件,需要修改的是resources/views/vendor/jetstream/emails/team-invitation.blade.php,而非vendor/laravel/jetstream目录下的源文件,否则修改不会生效。
内容的提问来源于stack exchange,提问作者Andrew Fox
相关产品推荐
相关产品推荐

