Laravel多选框回显旧值报错:htmlspecialchars()期望参数为字符串
问题原因
你遇到的这个报错核心原因是类型不匹配:
- 你的
<select>带multiple属性且name为keywords[],表单提交时会把选中的选项以数组的形式发送到后端,Laravel的old('keywords')会完整返回这个数组。 - 而Blade的
{{ }}语法默认会调用PHP的htmlspecialchars()函数对输出内容进行转义,这个函数的参数要求是字符串,直接传入数组就触发了expects parameter 1 to be string, array given的错误。
解决方案
根据你的使用场景,这里提供几种可行的处理方式:
1. 循环输出单个选中项
如果需要把选中的关键词逐个展示(比如用标签、列表形式),可以先判断旧值是否存在,再循环遍历数组:
@if($oldKeywords = old('keywords')) @foreach($oldKeywords as $keyword) <span class="badge bg-info">{{ $keyword }}</span> @endforeach @endif
2. 转换为字符串后输出
如果只需要将选中值以逗号分隔的字符串形式展示,用implode()把数组拼接成字符串即可:
{{ old('keywords') ? implode(', ', old('keywords')) : '' }}
这样htmlspecialchars()就能正常处理字符串类型的参数了。
3. 给Select2控件回显选中值
如果你需要在Select2组件中恢复之前选中的选项,要在初始化时传入旧值数组,注意这里要用{!! !!}输出未转义的JSON(因为Select2的val()方法需要数组参数):
$(function() { $('#keywords').select2({ // 你的远程数据源配置,比如ajax选项 placeholder: '请选择关键词', allowClear: true }).val({!! json_encode(old('keywords') ?: []) !!}).trigger('change'); });
内容的提问来源于stack exchange,提问作者Ben Jonson
相关产品推荐
相关产品推荐

