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

Laravel 9升级报错:htmlspecialchars()参数1类型不符问题排查

Laravel 8升9后部分页面报htmlspecialchars类型错误的解决办法

问题情况

把Laravel 8项目升级到9之后,登录页和仪表盘能正常打开,但访问其他视图就报错:

htmlspecialchars(): Argument #1 ($string) must be of type string, _ given in public/index.php: 52 ($request = Request::capture())

之前因为自定义视图里大量用{{ __('Dashboard') }}这种双下划线翻译语法报错,已经把所有自定义视图里的双下划线都删了,但为啥只有仪表盘正常,其他页面不行,一开始完全搞不懂。

问题根源

后来才发现是路由搞的鬼:

  • 虽然升级时复制了原来的路由文件,但之后执行artisan命令的时候,路由文件被重置成Laravel 9的默认路由了
  • 这时候访问那些原来有路由但现在没定义的页面,系统就会加载Laravel自带的404.blade.php错误页面,而这个内置页面里还留着双下划线翻译语法,比如{{ __('Page Not Found') }}。但因为之前的操作或者升级后的配置问题,翻译函数__()没正常工作,返回了个_而不是字符串,传到htmlspecialchars里就触发类型错误了。

解决步骤

  • 恢复正确的路由
    把备份的Laravel 8路由文件内容重新覆盖到项目的routes/web.php(或者对应的路由文件),保证所有需要访问的页面都有对应的路由定义;执行php artisan route:clear清一下路由缓存,让新路由生效。
  • 处理内置错误页面(可选)
    如果需要保留默认的404页面,先把Laravel的内置错误视图发布到项目里:php artisan vendor:publish --tag=laravel-errors;打开resources/views/errors/404.blade.php,把里面的双下划线语法换成纯文本,或者检查翻译配置确保__()能正常返回字符串。
  • 检查翻译配置(如果还要用翻译功能)
    看看config/app.php里的locale和fallback_locale配置是不是正确;确认resources/lang目录下有对应语言的翻译文件,要是不需要翻译,就干脆把所有地方的__()调用都换成纯文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:54:22