Php 中间件不';我没能像预期的那样工作-拉雷维尔

Php 中间件不';我没能像预期的那样工作-拉雷维尔,php,laravel,laravel-middleware,Php,Laravel,Laravel Middleware,我想做一个中间件来保护laravel 5.2应用程序中的管理路由。 user_type不是my db中users表中的字段,而是单独的表中的字段: 管理员的用户类型id为4 我制作了这个中间件: class AdminMiddleware { public function handle($request, Closure $next) { $authedUserID = Auth::id(); $user = User::query()

我想做一个中间件来保护laravel 5.2应用程序中的管理路由。 user_type不是my db中users表中的字段,而是单独的表中的字段:

管理员的用户类型id为4 我制作了这个中间件:

class AdminMiddleware
{

    public function handle($request, Closure $next)
    {
        $authedUserID = Auth::id();

        $user = User::query()
                ->leftjoin('users_user_types as uut', 'uut.user_id', '=', 'users.id')
                ->where('uut.user_id',"=","$authedUserID")
                ->get(['users.*',
                        'uut.user_type_id as userType'])->first();

        if ($user['userType'] !=4)
        {

            return redirect('/home');
        }

        return $next($request);
    }
}
并将其放入kernel.php中的$routeMiddleware数组中:

'admin' => \App\Http\Middleware\AdminMiddleware::class
这是我想应用中间件的管理路线之一:

Route::get('ptyadmin', 'AdminController@show')->middleware('admin');
问题是,当我使用管理员用户(用户类型=4)或普通用户(用户类型=1)进入此路由时,在这两种情况下,它都会重定向到/home


为什么会发生这种情况?我如何修复它???

首先
方法返回对象

if ($user->userType !=4)
也可以使用
select
代替
get

->select(['users.*','uut.user_type_id as userType'])->first();

当我将jwt.auth中间件放在routes.php中时,它可以工作:

Route::get('ptyadmin', 'AdminController@show')
->middleware('jwt.auth')
->middleware('admin');
而不是将其放在AdminController中:

public function __construct(User $user, JWTAuth $jwtauth)
{


}

你的
auth
middlewar在哪里?我把它放在AdminController:public function_uu构造(User$User,JWTAuth$JWTAuth){$this->中间件('jwt.auth',['except'=>[]);}@mrabbaniDump
dd(auth::id())
AdminMiddleware
中检查值?谢谢@mrabbani当我将jwt.auth middleware放在routes.php中时它可以工作,但为什么会发生这种情况??是因为当我把它放在AdminController中时,首先应用了管理中间件吗@mrabbaniYes我试图将它用作对象,但它返回了一个错误,因为在我找到修复它的答案之前,用户没有经过身份验证。但是现在这已经起作用了,谢谢。你为什么建议使用select()而不是get()@NikleshGet用于获取结果,select用于自定义列:,
   $this->middleware('jwt.auth', ['except' => []]);