【问题标题】:if esle condition not working inside constructor for middleware in laravel 5.4如果其他条件在 laravel 5.4 中的中间件的构造函数中不起作用
【发布时间】:2019-02-05 01:58:24
【问题描述】:

我一次只能使用一个中间件..在构造函数中..我想在构造函数或两个中间件中使用 if else 条件。

我只能在构造函数中使用中间件,如果其他条件也不起作用

示例如下

如果是这样

class HRJob extends Controller
{   
    public function __construct()
    {
        if(Auth::guard('admin'))
        {
            $this->middleware('auth:admin');
        }
        else
        {
            $this->middleware('auth');
        }
    }
    public function userdetails()
    {
        dd(Auth::user());
    }
}

两个中间件

class HRJob extends Controller
{  
    public function __construct()

        $this->middleware('auth:admin');
        $this->middleware('auth');
    }

    public function userdetails()
    {
        dd(Auth::user());
    }
}

【问题讨论】:

    标签: laravel authentication constructor laravel-5.4 middleware


    【解决方案1】:

    在您的情况下,不需要两个中间件。

    public function __construct()
    {
        $this->middleware('auth');
    }
    

    等效于您尝试执行的任何操作,因为“auth”对“auth:admin”仍然有效。

    但您仍然可以像这样将中间件放在 Routes 文件 (web.php/api.php) 中

    Route::group(['middleware'=>'auth:admin'],function (){
        Route::get('/', 'HRJob@userdetailsAdmin');
    });
    
    Route::group(['middleware'=>'auth'],function (){
        Route::get('/', 'HRJob@userdetails');
    });
    

    希望这会有所帮助。

    ---编辑---

    在您的情况下,使用两个不同的表进行身份验证并且没有为“任何身份验证”创建自定义中间件,您只是缺少 check() 方法:

    if (Auth::guard('admin')->check()) {
        $this->middleware('auth:admin');
    } else {
        $this->middleware('auth');
    }
    

    这相当于

    if (!Auth::guard('admin')->check()) {
        $this->middleware('auth');
    }
    

    【讨论】:

    • #N69S 我想为两个中间件使用一个函数。在你的情况下,你为两个中间件使用两个不同的函数。你的解决方案适用于两个不同的函数。但我想使用两个中间件只有一个功能..
    • @PrashantPatil ,如果您想将两个中间件用于相同的功能,请仅使用“auth”中间件而不使用“auth:admin”中间件。因为当“auth:admin”有效时,“auth”也有效。
    • #N69S 我有两个单独的表进行身份验证以下中间件指向不同的表进行身份验证或登录 $this->middleware('auth:admin') - 管理员 $this->middleware('auth' )- 用户根据你的情况 $this->middleware('auth') 只指向用户表我想要 $this->middleware('auth:admin') 指向管理表而不是用户表
    • @PrashantPatil ,现在我明白了。最好的解决方案是创建一个自定义中间件,该中间件对任何一种身份验证方法都有效。但是使用您的格式,您可以输入 if 条件“if (Auth::guard('admin')->check())”
    • 我也这样做了你看看我是否使用了“if (Auth::guard('admin')->check())”条件,如果这将是真的,那么它将是相应地登录“ $this->middleware('auth:admin')”中间件(管理员登录将起作用)..但如果“if (Auth::guard('admin')->check() )" 或 "if (Auth::guard('admin')" 将被执行然后 $this->middleware('auth'); 中间件未执行..只有一个中间件在构造函数内工作。根据 if& else 也 if它将进入 if 条件并正常工作,否则条件中间件将无法正常工作,反之亦然
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 2018-01-27
    • 2017-02-18
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多