控制器Laravel 5.4中的多个中间件

时间:2017-09-21 18:55:52

标签: laravel laravel-5 laravel-5.4 middleware

我想在我的控制器中使用__construct方法中的两个中间件。我最后几个小时在谷歌搜索,但没有找到任何有用的资源。

这是我的__construct中间件:

public function __construct()
{
    $this->middleware('adminuser');
    $this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

我想为普通用户提供访问那些generaluser中间件方法。 我是怎么做到的?

请帮我解决这个问题。

谢谢

4 个答案:

答案 0 :(得分:5)

所以,你需要使用" OR"对于您的中间件,它不存在。相反,您可以使用middleware parameters并在中间件中发挥魔力。

创建一个中间件来检查所有角色,而不是每个角色都有一个中间件。

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, $role)
    {
        $roles = array_except(func_get_args(), [0,1]) // get array of your roles.

        // $request->user()->role IS AN EXAMPlE
        if (! in_array($request->user()->role, $roles)) {
            // Redirect...
        }

        return $next($request);
}

接下来是在kernel.php,routeMiddleware数组中注册它:

'role' => \App\Http\Middleware\CheckRole::class,

然后您可以同时检查多个角色

$this->middleware('role:adminuser')->only('functionA', 'functionB');

$this->middleware('role:adminuser,guestuser')->only('functionC', 'functionD');

注意:这是一个示例,您可以根据需要更改中间件中的逻辑。

答案 1 :(得分:4)

在路径文件中使用中间件,而不是在构造

Route::middleware(['adminuser'])->group(function () {

   //Only admins can access this

    Route::get('/','Controller@method');
    Route::get('/admins','Controller@method');
});

Route::middleware(['generaluser'])->group(function () {

    // General users access this

    Route::get('/users', 'Controller@method');
    Route::get('/generalusers', 'Controller@method');
});

如果您想同时使用两个中间件

Route::middleware(['firstMiddleWare','secondMiddleWare'])->group(function () {
    Route::get('/aroute', 'Controller@method');
});

所有用户都可以使用不属于某个组的路由

答案 2 :(得分:1)

我猜adminuser中间件允许管理员用户阻止其他用户,因此非管理员永远不会到达generaluser中间件。 您可以尝试从generaluser中间件中排除adminuser方法:

public function __construct()
{
    $this->middleware('adminuser')->except('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
    $this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

答案 3 :(得分:1)

非常感谢Morteza Rajabi给了我这个想法,以下是我对他的想法适用的代码。

我正在为两个用户创建一个新的中间件,这里是代码:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfNotAdminUserOrGeneralUser
{
    public function handle($request, Closure $next, $guard = null)
    {
        switch ($guard) {
            case 'adminuser':
                if (!Auth::guard($guard)->check()) {
                    return redirect('/');
                }
            break;
            case 'generaluser':
                if (!Auth::guard($guard)->check()) {
                    return redirect('/');
                }
            break;
        }
        return $next($request);
    }
}

然后在我的控制器中应用此功能,并按照我的意愿为他们提供访问权限。 admin用户可以访问所有方法,一般用户可以访问其中的一些方法。这意味着两个用户可以访问相同的方法。

这是控制器代码:

    public function __construct()
{
    $this->middleware('adminuser')->only('index','create','edit','store','delete','trashIndex','restore','permanentlyDelete','addGroups','addGroupsStore','addQuestions','addQuestionsStore','countGroup','countQuestion');
    $this->middleware('auserorguser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

再次感谢Morteza Rajabi。