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

Laravel 8 Blade input-group组件UTF-8编码特殊字符转义异常问题

问题根因

这是典型的二次HTML实体转义问题,和你数据库的编码配置无关,问题出在Blade组件的属性取值逻辑上:
Laravel 8的Blade组件中$attributes是Illuminate\View\ComponentAttributeBag类的实例,使用数组语法$attributes['xxx']取属性值时,返回的已经是经过HTML实体转义后的内容;你再用Blade的默认转义语法{{ }}包裹,相当于对已经转义的内容做了第二次转义,就会把单引号对应的'中的&再次转义为&,最终得到你看到的异常输出。

解决方案

优先使用属性袋的get()方法获取原始未转义的属性值,同时可以用get()的第二个参数设置默认值,替代冗余的三目判断。

修正后的组件代码

<div class="form-group" {{ $attributes->merge(['style' => $attributes->get('style', '')]) }}>
    @if($attributes->has('label'))
        <label for="{{ $attributes->get('id') }}">{{ $attributes->get('label') }}</label>
        <input type="text" 
               value="{{ $attributes->get('value', '') }}" 
               class="form-control form-control-sm" 
               name="{{ $attributes->get('name') }}" 
               id="{{ $attributes->get('id') }}" 
               placeholder="{{ $attributes->get('placeholder', '') }}">
    @else 
        <input style="width:100%;" type="text" value="{{ $attributes->get('value', '') }}" class="form-control form-control-sm" name="{{ $attributes->get('name') }}" id="{{ $attributes->get('id') }}" placeholder="{{ $attributes->get('placeholder', '') }}">
    @endif
</div>

备用方案(不推荐)

如果你确认属性内容没有XSS风险,也可以直接用Blade非转义输出语法{!! !!}包裹原有取值代码,比如:

value="{!! isset($attributes['value']) ? $attributes['value'] : null !!}"

该方案存在跨站脚本攻击风险,仅做临时验证使用,不建议线上环境采用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:27:02