Laravel中间件运行时报Call to a member function send() on string错误
错误原因
- 核心问题是Laravel中间件的
handle方法必须返回Illuminate\Http\Response实例,你当前代码中return route('dashboard')返回的是字符串类型的路由URL,不是标准响应对象。 - Laravel的HTTP内核后续会尝试调用返回值的
send()方法输出响应,字符串没有这个方法,就会抛出Call to a member function send() on string错误。 - 另外代码中存在的
echo $wallets语句会提前输出内容,可能导致响应头设置异常,也需要移除。
解决方案
将中间件中跳转路由的逻辑改为返回重定向响应实例,修改后的handle方法代码如下:
public function handle(Request $request, Closure $next) { $wallets = Wallet::count(); if($wallets == 0){ // 返回重定向响应实例,而不是字符串URL return redirect()->route('dashboard'); } return $next($request); }
额外优化建议
- 原代码
Wallet::get()->count()会先查询所有Wallet表记录再统计数量,数据量大时性能极差,改为Wallet::count()可以直接执行SQL的count查询,效率更高。 - 注意
dashboard路由本身带有auth中间件,若未登录的用户触发该中间件跳转,会先被重定向到登录页,符合常规业务逻辑,无需额外调整。
内容的提问来源于stack exchange,提问作者ahmad
相关产品推荐
相关产品推荐

