多个控制器中间件在Laravel 5.2中使用相同的方法

时间:2017-04-25 22:39:15

标签: php laravel controller middleware guard

我试图使用具有不同中间件的相同控制器的某些方法,例如让管理员和用户使用方法索引并在同一个控制器中创建。所以我让管理员成为了一名用户守卫。

这是我的AdminMidleware

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AdminMidleware
{

    public function handle($request, Closure $next)
    {
        if (Auth::guard('admin')->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('/');
            }
        }

        return $next($request);
    }
}

我的用户中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class UserMiddleware
{

    public function handle($request, Closure $next)
    {
        if (Auth::guard('user')->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('/');
            }
        }

        return $next($request);
    }
}

它们都位于$ routeMiddleware

中的kernel.php中
'admin' => \App\Http\Middleware\AdminMidleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,

如果我使用这个,我可以让只有管理员才能访问这些方法,并且它可以工作,你必须和管理员一起使用这些方法。

public function __construct(){
   $this->middleware('admin', ['only' => [
      'index',
      'create',
   ]]);
}

这假设使用户和管理员能够在同一控制器中使用索引和创建方法作为第一参数发送一个带有管理员和用户中间件的数组,

public function __construct(){
   $this->middleware(['admin', 'user'], ['only' => [
      'index',
      'create',
   ]]);
}

但是,它不起作用,实际上没有人能够使用这些方法,你能帮助我做好这项工作吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

由于您的中间件是相同的,除了使用的guard之外,您可以尝试制作一个auth中间件,模仿新版本Laravel附带的auth中间件。这可以让你将多个警卫作为参数传递给中间件。

public function handle($request, Closure $next)
{
    // get guards or use 'null' (default guard)
    $guards = array_slice(func_get_args(), 2) ?: [null];

    // spin through guards to find one that checks out
    foreach ($guards as $guard) {
        if (Auth::guard($guard)->check()) {
            // if we have a guard name, not null
            if ($guard) {
                // use this guard as the default
                Auth::shouldUse($guard);
            }

            // we have an authed user from some guard move along
            return $next($request);
        }
    }

    // handle no authed user
    if ($request->ajax() || $request->wantsJson()) {
        return response('Unauthenticated.', 401);
    }

    return redirect()->guest('/');
}

它将旋转通过的所有守卫,如果其中任何一个解决了用户,该守卫将成为Auth将使用的默认守卫。

$this->middleware('thatmiddleware:user,admin');

这样的事情应该有用。