Laravel 5.7中内容含{{ }}导致视图无法加载的问题求助
问题分析与解决方案
你遇到的核心问题是Laravel Blade模板引擎的语法冲突:当用户输入的内容里包含{{ }}时,Blade在编译模板时会把这些字符当成自身的模板语法标记,试图去解析它们,但这些{{ }}只是普通用户内容,并非有效的Blade表达式,这直接导致模板编译出错,最终页面渲染异常(虽然源码存在,但浏览器无法正常解析错误的模板输出)。
下面是几种可行的解决办法:
方案1:保存数据时自动转义{{ }}(推荐)
通过模型的修改器(Mutator),在数据保存前自动把{{ }}转成对应的HTML实体{{和}}。这样Blade编译模板时不会把它们识别为语法标记,渲染后浏览器会自动将实体转换回{{ }}显示。
在你的Question模型中添加以下代码:
/** * 自动处理question字段的转义逻辑 */ public function setQuestionAttribute($value) { $escapedContent = str_replace( ['{{', '}}'], ['{{', '}}'], $value ); $this->attributes['question'] = $escapedContent; }
之后用户通过Summernote输入的{{ 示例内容 }}会被自动转义保存,渲染时直接用{!! $question->question !!}输出即可正常显示。
方案2:批量修复已存在的旧数据
如果你已经有很多包含{{ }}的历史数据,可以通过临时脚本批量修复:
比如在routes/web.php中添加一个临时路由(执行完成后记得删除):
Route::get('/fix-old-questions', function () { \App\Models\Question::chunk(100, function ($questions) { foreach ($questions as $question) { $fixedContent = str_replace( ['{{', '}}'], ['{{', '}}'], $question->question ); $question->question = $fixedContent; $question->save(); } }); return '历史数据修复完成!'; });
访问这个路由就能批量处理所有旧数据,解决已存在的渲染问题。
方案3:渲染时临时转义(应急用)
如果不想修改保存逻辑,可以在渲染视图时动态转义内容后再输出:
<div class="col-md-8"> <h1>Question # {{ $question->id }}:</h1> <p>{!! str_replace(['{{', '}}'], ['{{', '}}'], $question->question) !!}</p> </div>
不过这个方法每次渲染都要处理字符串,性能不如保存时处理,而且如果内容中有其他Blade语法标记仍可能冲突,所以只建议临时应急使用。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

