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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:06:02