You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(['{{', '}}'], ['&#123;&#123;', '&#125;&#125;'], $question->question) !!}</p>
</div>

不过这个方法每次渲染都要处理字符串,性能不如保存时处理,而且如果内容中有其他Blade语法标记仍可能冲突,所以只建议临时应急使用。

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:42:33