douzhenchun6782 2017-12-01 21:03
浏览 158
已采纳

具有OR条件的路径中的Laravel多个中间件

I wonder if I can do this in Laravel Route. Let's say I have Admin, Premium and User (which can be login too by using Auth) Middleware. Also, I have controller with methods like this: index, create, edit, delete and I want Admin to be able do all those things, but Premium can only be able to access index method, and User can't access anything in this controller (he can access another controller). I know I can use except or only middleware method like this:

    public function __construct()
    {
    $this->middleware('premium')->only('index');
    $this->middleware('admin'); 
    // or maybe $this->middleware('admin')->except('index');
    }

but when I try to put these two middlewares in __construct method they will start to conflict each other, it makes sense because index method can be access by Premium Member but then can't be access by the Admin itself. Btw my middleware is simply checking:

    if (Auth::check()) {
        if (Auth::user()->role == 'Admin') {
            return $next($request);
        }
     }
    return redirect('/home');

So, back to my question, can I have OR Middleware so I can avoid conflict from multiple middleware (which is must be AND condition when they written at the same controller constructor)?

Thanks a lot.

  • 写回答

2条回答 默认 最新

  • duannaiying9662 2017-12-01 21:52
    关注

    If you change up the way your logic is thinking a little bit, the answer becomes pretty easy. You can create new middleware that checks if it can access the specific method.

    So create the following middleware 'CanAccessIndex':

    if (Auth::check()) {
        if (Auth::user()->role == 'Admin' || Auth::user()->role == 'Premium') {
            return $next($request);
        }
     }
    return redirect('/home');
    

    Then, you can put that middleware on the index function (instead of the premium middleware) and put your admin middleware on everything EXCEPT index. Like so:

    public function __construct()
    {
        $this->middleware('canAccessIndex')->only('index');
        $this->middleware('admin')->except('index');
    }
    

    That's one way to do it.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备