Laravel 7(PHP 7.4)使用TinyEditor编辑的邮件模板变量无法正常替换问题求助
解决Laravel邮件模板中TinyEditor编辑内容的变量无法替换问题
我明白你遇到的问题了——后台用TinyEditor编辑的邮件模板里有{{$name}}这类变量占位符,但发送邮件时这些标识根本没被替换成真实的用户名。其实核心原因很简单:Blade不会二次解析已经通过{!! !!}输出的静态内容,你直接输出模板文本的话,里面的{{$name}}就只是普通字符串而已。
下面给你两种可行的解决方案,按安全性和易用性排序:
方案1:手动批量替换变量(推荐)
这种方法最安全可控,适合用户编辑模板的场景。我们直接把模板里的占位符替换成真实值,再传递给视图输出。
控制器代码修改:
$name = $user->name; $template = Template::where('code',1)->first(); // 定义需要替换的变量映射,支持多个变量 $replaceMap = [ '{{$name}}' => $name, // 如果还有其他占位符,比如{{$adminContact}},可以继续加在这里 // '{{$adminContact}}' => 'support@example.com' ]; // 批量替换模板内容里的占位符 $emailContent = strtr($template->text_email, $replaceMap); Mail::send('mail.user', compact('emailContent'), function ($message) use ($email, $fullname) { $message->from('your-sender-email@example.com'); $message->subject('test'); $message->to($email, $fullname); });
对应的Blade模板(mail/user.blade.php):
{!! $emailContent !!}
方案2:用Blade编译器动态编译模板字符串
如果你确实想让Blade解析模板里的{{}}语法,可以用Laravel自带的Blade编译器来编译字符串内容。但要注意:如果模板是由普通用户编辑的,这种方法有代码注入风险,务必谨慎使用!
控制器代码修改:
use Illuminate\View\Compilers\BladeCompiler; use Illuminate\Filesystem\Filesystem; $name = $user->name; $template = Template::where('code',1)->first(); // 初始化Blade编译器 $bladeCompiler = new BladeCompiler(new Filesystem(), storage_path('framework/views')); // 编译模板字符串为可执行的PHP代码 $compiledCode = $bladeCompiler->compileString($template->text_email); // 执行编译后的代码,获取最终内容 ob_start(); // 把变量注入到当前作用域,让编译后的代码能访问到 eval('?>' . $compiledCode); $emailContent = ob_get_clean(); Mail::send('mail.user', compact('emailContent'), function ($message) use ($email, $fullname) { $message->from('your-sender-email@example.com'); $message->subject('test'); $message->to($email, $fullname); });
对应的Blade模板同样只需输出编译后的内容:
{!! $emailContent !!}
为什么你之前的尝试没用?
你之前在Blade里写的@php echo $name; @endphp或者{{ !! $name !! }},都是在Blade模板本身里输出变量,而TinyEditor编辑的{{$name}}是模板文本里的静态字符串——Blade只会解析模板文件里的语法,不会去解析已经输出的字符串内容,所以这些写法自然不会生效。
内容的提问来源于stack exchange,提问作者ezles88
相关产品推荐
相关产品推荐

