Laravel中间件多条件判断仅首个if生效后续被忽略的修复方法
问题原因
- 逻辑结构错误:豁免权限判断仅和「无用户资料」的场景耦合,没有覆盖所有校验流程。原有代码中拥有豁免权限的用户依然会触发后续的资料状态校验、企业授权校验,不符合豁免类权限的设计预期。
- 语法层面的正常执行逻辑:当非豁免用户未填写用户资料时,第一个if中三个
&&连接的条件会同时满足,代码直接return重定向响应,后续所有判断自然不会执行,这是PHP的正常语法特性而非BUG。 - 存在冗余判断:
is_object($user_profile)属于冗余判断,Laravel查询构造器的first()方法无匹配数据时会返回null,直接判断变量本身即可。
修复代码
调整判断顺序,优先校验豁免权限,只要拥有指定权限就直接放行,同时简化冗余判断:
class HasBilling { public function handle($request, Closure $next) { // 优先校验豁免权限,命中直接放行跳过所有后续校验 if (\Auth::user()->hasPermissionTo('soy-agente') || \Auth::user()->hasPermissionTo('soy-agente_inversor')) { return $next($request); } $user_profile = UsersProfile::where('user_id', Auth::id())->first(); if (!$user_profile) { return redirect()->route('myaccount.facturacion.ver')->with('error', 'No posees datos de facturación. Antes de usar algunas funciones como facturación, publicidad, merkado, tarifas... debes rellenar los datos.'); } if (is_null($user_profile->validate)) { return redirect()->route('myaccount.facturacion.ver')->with('error', 'Tus datos de facturación están pendiente de validar'); } if ($user_profile->validate == 2) { return redirect()->route('myaccount.facturacion.ver')->with('error', 'Tus datos de facturación han sido rechazados.'); } if (\Auth::user()->activity == "empresa") { $autorizado = UsersProfileAutorizado::find($user_profile->id); if (!$autorizado) { return redirect()->route('myaccount.autorizado.ver')->with('error', 'No posees ningún autorizado. Al ser una empresa, antes de usar algunas funciones como la facturación o la publicidad debes rellenar los datos de autorizado.'); } if (is_null($autorizado->validate)) { return redirect()->route('myaccount.autorizado.ver')->with('error', 'Tu autorizado está pendiente de validar.'); } if ($autorizado->validate == 2) { return redirect()->route('myaccount.autorizado.ver')->with('error', 'Tu autorizado ha sido rechazado.'); } } return $next($request); } }
补充说明
如果你的业务预期是「即使用户没有资料,也需要执行后续其他判断」,则属于第一个if的逻辑运算符使用错误,可根据实际业务需要将三个条件之间的&&(逻辑与)调整为||(逻辑或),但从代码自带的错误提示文本来看,上述调整判断顺序的方案更贴合原有业务设计。
内容的提问来源于stack exchange,提问作者Jagcweb
相关产品推荐
相关产品推荐

