在Laravel中如何将变量传入数据库调取的邮件模板正文?
解决方案
你可以通过以下2种常用方案实现变量替换,根据你的业务场景选择即可:
方案1:轻量字符串替换(无需额外依赖,适合简单模板场景)
因为你的模板里已经统一用{{$变量名}}作为占位符,直接遍历变量数组做全局替换即可,代码示例如下:
// 你原来获取模板的代码 $record = DB::table('email_templates')->select('content','em_temp_id')->where('em_temp_id', $request->select_temp)->where('is_active', 1)->first(); $body = htmlspecialchars_decode($record->content); // 新增变量替换逻辑 $arr_pass['userName'] = 'John'; $arr_pass['service_provider'] = 'abc.com'; $arr_pass['channel'] = 'Tom'; foreach ($arr_pass as $key => $value) { $search = '{{$' . $key . '}}'; $body = str_replace($search, $value, $body); } // 后面正常调用邮件发送即可,$body已经是替换完的内容 Mail::send([],[], function($message) use ($Toarray, $ToCCarray, $ToBCCarray, $subject, $body, $is_plainOrHtml){ $message->to($Toarray, ''); $message->cc($ToCCarray, ''); $message->bcc($ToBCCarray, ''); $message->subject($subject); $message->setBody($body, 'text/html'); });
该方案实现简单,无额外性能开销,适合模板变量不复杂、没有条件判断/循环等复杂逻辑的场景。
方案2:使用Blade模板引擎渲染(适合有复杂模板逻辑的场景)
如果你后续模板需要加循环、条件判断等复杂逻辑,可以直接用Laravel自带的Blade渲染工具处理字符串模板,代码示例如下:
use Illuminate\Support\Facades\Blade; // 获取模板和变量的逻辑和之前一致 $record = DB::table('email_templates')->select('content','em_temp_id')->where('em_temp_id', $request->select_temp)->where('is_active', 1)->first(); $bodyTemplate = htmlspecialchars_decode($record->content); $arr_pass['userName'] = 'John'; $arr_pass['service_provider'] = 'abc.com'; $arr_pass['channel'] = 'Tom'; // 用Blade渲染模板字符串 $body = Blade::render($bodyTemplate, $arr_pass); // 后续正常发邮件即可
该方案支持所有Blade语法,扩展性更强,适合后续模板逻辑会迭代的场景。
注意:如果模板支持用户编辑,使用Blade方案需要做好安全过滤,避免恶意代码注入风险。
内容的提问来源于stack exchange,提问作者MHEMBINT
相关产品推荐
相关产品推荐

