Laravel邮件函数无法传递变量至视图,提示变量未定义
解决Laravel邮件视图中「变量未定义」的问题
我来帮你排查下这个问题哈,你遇到的错误主要是因为邮件数据传递的方式不对,还有闭包变量作用域的问题,咱们一步步来修复:
问题分析
- 闭包变量未引入:你在
Mail::send的闭包里想访问外部的$data,但没有用use关键字引入,导致闭包内部根本拿不到这个变量。 - 视图数据传递方式错误:
Mail::send的第二个参数已经是要传递给视图的数据数组了,你额外调用->with('data',$data)完全是多余的,而且这里的$data本身就访问不到。 - 视图变量调用可以更简洁:你传递的
$data数组键是emailMessage,视图里不需要套$data['emailMessage'],直接用变量名即可。
修复后的控制器代码
public function broadcastemail(Request $request) { $this->validate($request, [ 'subject' => 'required', 'emailMessage' => 'required' ]); // 整理要传递给视图的数据 $data = [ 'emailMessage' => $request->emailMessage ]; // 用use引入外部的$request,避免闭包内无法访问 Mail::send('backend.user.emailMessage', $data, function($message) use ($request) { $subject = $request->subject; $user = User::find('31'); $email = $user->email; $name = $user->first_name; // 移除多余的with方法,视图数据已经通过第二个参数传递 $message->to($email, $name)->subject($subject); }); return back()->withSuccess('Mail Sent Successfully'); }
对应的视图代码(两种可选方式)
方式一:直接使用变量(推荐)
<p>{{ $emailMessage }}</p>
方式二:保留$data数组结构(如需传递多个变量打包)
如果一定要在视图里用$data['emailMessage'],可以调整控制器里的数据结构:
// 控制器里修改$data的结构 $data = [ 'data' => [ 'emailMessage' => $request->emailMessage // 可以在这里添加其他需要传递的变量 ] ];
此时视图里的{{ $data['emailMessage'] }}就能正常访问了。
额外注意点
- 闭包内要访问外部变量时,必须通过
use关键字引入,比如上面的use ($request)。 Mail::send的第二个参数是视图专属的数据源,数组的键就是视图中可直接调用的变量名,无需额外嵌套。$message->with()方法是用来给邮件消息本身添加元数据的,不是给视图传递参数的,别用错地方啦。
内容的提问来源于stack exchange,提问作者macjayz
相关产品推荐
相关产品推荐

