Livewire开发中htmlspecialchars类型错误求助:Argument #1 ($string)必须为string类型,却传入stdClass
错误根源
你遇到的htmlspecialchars(): Argument #1 ($string) must be of type string, stdClass given错误,核心原因是模板变量名冲突,导致Blade渲染时错误地将对象传入了htmlspecialchars函数:
在你的视图代码中,@foreach($banks as $bank)定义了一个局部循环变量$bank(类型是银行对象stdClass),而你的Livewire组件也有一个同名的公共属性$bank(字符串类型)。当Blade渲染脚本中的{{$bank}}时,它优先引用了foreach循环的最后一个$bank对象,而非组件的字符串属性,因此触发了类型错误。
另外,你的下拉框代码还有一个小问题:option的value属性被额外包裹了单引号,这会导致选中后$bank属性拿到的是带单引号的字符串(比如'招商银行'),不符合预期。
分步解决方法
修复变量名冲突
把foreach循环中的局部变量重命名,避免和组件属性冲突,比如改成$bankItem:<select wire:model="bank" name="bank" class="form-select"> @foreach($banks as $bankItem) <option value="{{$bankItem->name}}">{{$bankItem->name}}</option> @endforeach </select>修正下拉框的value值
移除value中的多余单引号,确保选中后$bank拿到的是纯字符串(比如招商银行),而非带引号的字符串。安全渲染JS中的组件属性
脚本中的toggleViews({{$bank}})需要将字符串安全传入JS函数,直接渲染会有语法风险(比如字符串含空格、特殊字符),推荐使用Blade的@js指令自动转义:<script type="text/javascript"> window.onload = function() { Livewire.on('changeModels', () => { toggleViews(@js($bank)) }) } </script>如果你不想用
@js,也可以手动用单引号包裹并转义:toggleViews('{{addslashes($bank)}}')
验证修复
修改完成后,当你切换下拉选项时:
- Livewire的
$bank属性会正确接收纯字符串值 - 触发
changeModels事件时,脚本会正确渲染字符串类型的$bank,不会再出现类型错误
内容的提问来源于stack exchange,提问作者Levetot limited

