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
相关产品推荐
相关产品推荐

