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

MD *_*fat 5 middleware laravel laravel-5 laravel-5.4

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

这是我__construct的中间件:

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

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

请帮我解决这个问题.

谢谢

Mor*_*abi 5

因此,您需要为您的中间件使用类似"OR"的东西并且它不存在.相反,您可以使用中间件参数并在中间件中进行魔术.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

'role' => \App\Http\Middleware\CheckRole::class,
Run Code Online (Sandbox Code Playgroud)

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

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

$this->middleware('role:adminuser,guestuser')->only('functionC', 'functionD');
Run Code Online (Sandbox Code Playgroud)

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


Ach*_*dja 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');
});
Run Code Online (Sandbox Code Playgroud)

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

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

不属于某个组的路由将可供所有用户使用