Laravel 9自定义中间件报错syntax error, unexpected token "return"
Laravel中间件syntax error, unexpected token "return" 修复方案
错误触发原因
语法错误直接来自handle方法中离线模式判断的if语句缺失闭合右括号,PHP解析器读取到未闭合的条件表达式时直接遇到return关键字,因此抛出语法解析错误。
除此之外代码中还存在两处会触发运行时报错的隐患:
- 维护模式判断分支中调用
$this->disabled()时传入的$middleware、$isPOST两个变量未在当前作用域定义,语法错误修复后运行到此处会触发undefined variable报错。 - 现有代码所有if语句均未书写大括号包裹逻辑块,非常容易出现括号匹配错误、逻辑归属错误,属于高风险编码习惯。
修复步骤
- 给离线模式判断的if条件末尾补上缺失的右括号,同时给所有流程控制语句补全大括号
- 调整维护模式分支的传参,移除未定义的变量,匹配你自定义
disabled方法的实际参数要求即可
修复后参考代码
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Str; use Illuminate\Support\Facades\Auth; class webAPIchecker { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse */ public function handle(Request $request, Closure $next) { $route = $request->route()->getName(); // 离线模式校验逻辑 $adminsOnlyPass = config('web.offlinePass'); if ((web('offline_enabled') && !in_array(session('admins_only'), $adminsOnlyPass)) || !web('offline_enabled') && session()->has('admins_only')) { session()->forget('admins_only'); } // 已补全缺失的右括号 if (web('offline_enabled') && !session()->has('admins_only') && !Str::startsWith($route, 'offline.')) { return redirect()->route('offline.offline'); } if (!web('maintenance_enabled') && Str::startsWith($route, 'maintenance.')) { // 此处请根据你自定义disabled方法的实际参数要求调整传参,原代码传入的$middleware、$isPOST未定义 // 示例:如果方法只需要场景名参数可直接写为 return $this->disabled('Maintenance'); abort(404); } return $next($request); } }
编码建议:所有流程控制语句(if/for/foreach/while等)无论后续执行逻辑是1行还是多行,都强制书写大括号包裹,可有效避免括号漏匹配、逻辑执行范围错误这类低级问题。
内容的提问来源于stack exchange,提问作者CryptoPath
相关产品推荐
相关产品推荐

