Laravel使用Mail::later发延迟邮件提示Mailable类userdata属性未定义
问题原因
使用later方法发送邮件时,Laravel会对Mailable类执行序列化/反序列化操作存入队列,你的DueReminder类没有显式声明$userdata公共属性。同步调用send方法时不需要序列化,PHP支持动态给对象赋值,所以不会报错;但队列序列化只会保留类中显式声明的属性,反序列化后动态赋值的属性会丢失,因此触发未定义属性的报错。
解决方案
在DueReminder类顶部显式声明公共的$userdata属性即可,修正后的代码如下:
class DueReminder extends Mailable { use Queueable, SerializesModels; // 新增此行,显式声明公共属性 public $userdata; /** * Create a new message instance. * * @return void */ public function __construct($dat) { $this->userdata = $dat; } /** * Build the message. * * @return $this */ public function build() { return $this->from('test@gmail.com', 'Test') ->subject('Test: Testing') ->view('email.sendReminder',['data1' => $this->userdata]); } }
修改后重启队列服务即可正常运行,如果你传入的$dat是Eloquent模型/集合实例,SerializesModels trait会自动完成正确序列化,无需额外处理。
内容的提问来源于stack exchange,提问作者user17298617
相关产品推荐
相关产品推荐

