如何在Laravel中将控制器变量传递给队列邮件的Blade视图
问题排查
你代码里有2个核心错误导致队列任务执行失败:
- 实例化
OrderMail时没有传入$this->array参数,且调用Mail::send()时传了错误的参数(应该传Mailable实例,而不是数组) - 若要在Blade模板直接使用
$array变量,你当前只往视图传递了data参数,没有传递完整的$array
修正后的OrderEmailJob代码
public function handle() { // 实例化OrderMail时传入数组参数 $email = new OrderMail($this->array); // send方法传入Mailable实例 Mail::to($this->array['email'])->send($email); }
视图调用$array说明
Laravel的Mailable会自动将类的public属性暴露给Blade视图,你已经在OrderMail中声明了public的$array属性,修正Job代码后直接在邮件Blade模板里用$array即可读取所有值。如果要显式声明传递,可以修改OrderMail的build方法:
public function build() { return $this->view($this->array['view']) ->from($this->array['from'], config('mail.from.name')) ->subject($this->array['subject']) ->with([ 'data' => $this->array['data'], 'array' => $this->array // 显式传递$array到视图 ]); }
额外注意点
- 不要在配置文件以外的代码中直接调用
env()函数,当你执行php artisan config:cache后,所有非配置文件下的env()调用都会返回null,建议改成读取对应的config配置,比如发件人名称读取config('mail.from.name') - 队列任务修改后需要重启
queue:listen或者queue:work进程,否则旧的代码逻辑还会在队列进程中运行,修改不会生效。
内容的提问来源于stack exchange,提问作者Catto
相关产品推荐
相关产品推荐

