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

Php 使用Laravel 5.2中相同方法的多控制器中间件,php,laravel,controller,middleware,guard,Php,Laravel,Controller,Middleware,Guard,我试图用不同的中间件使用同一控制器的一些方法,例如让管理员和用户在同一控制器中使用方法索引和创建。所以我做了一个管理员守卫和一个用户守卫 这是我的管理员 <?php namespace App\Http\Middleware; use Closure; use Auth; class AdminMidleware { public function handle($request, Closure $next) { if (Auth::guard('

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

这是我的管理员

<?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);
    }
}
如果我使用这个,我可以使只有管理员才能访问这些方法,而且它是有效的,你必须以管理员的身份登录才能使用这些方法

public function __construct(){
   $this->middleware('admin', ['only' => [
      'index',
      'create',
   ]]);
}
假设这使得用户和管理员都能够在同一个控制器中使用索引和创建方法,并使用管理员和用户中间件作为第一个参数发送一个数组

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

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

由于您的中间件是相同的,除了使用的
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');
这样的办法应该行得通

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('/');
}
$this->middleware('thatmiddleware:user,admin');