Laravel 如何给多角色控制器添加中间件?

Laravel how to add middleware to controller with multiple roles?

我想要实现的是 EventController 的函数/方法应该可用于 role:organizer,并且只有 view() 方法 [URL: /events/{id}] 来自role:artist.

也应该可以使用相同的控制器

我试图通过创建以下中间件来检查登录用户的角色来实现它: class 用户角色

{
    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return Application|JsonResponse|RedirectResponse|Redirector
     */
    public function handle(Request $request, Closure $next, ...$roles)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        if (!Auth::check()) {
            return redirect(RouteServiceProvider::HOME);
        }

        if (in_array(strtolower(Auth::user()->type), $roles)) {
            return $next($request);
        }

        return redirect('/login');
    }
}

然后在我的 EventController 中,我在构造函数中分配了以下中间件:

public function __construct()
    {
        $this->middleware(['auth', 'verified', 'onboarding', 'role:organizer']);
        $this->middleware(['role:artist,organizer'])->only('view');
    }

当我 运行 php artisan route:list - 我得到了我想要的列表,只有 events/{id} 同时具有组织者和艺术家角色

然而,当我使用用户艺术家登录并尝试访问 localhost/events/10 - 我被重定向到 /login 屏幕,但是当我尝试使用角色组织者访问相同的 URL 时,它有效..

关于如何让它发挥作用有什么建议吗?如果有什么不明白的地方告诉我,我会帮助你!

问题是您在第一次使用 'role:organizer' 附加了中间件以查看端点两次检查用户是否具有角色组织者并且它正在重定向并且它不会第二次检查所以要排除这种行为你应该像这样附加中间件

$this->middleware(['auth', 'verified', 'onboarding']);
$this->middleware(['role:artist,organizer'])->only('view');
$this->middleware('role:organizer')->except('view');// because it already added above