自己的 RoleMiddleware 没有被正确调用

Own RoleMiddleware doesn't get called properly

就在几周前,我开始 Laravel,这几周我的项目取得了一些不错的进展。

3 天前我决定在系统中为我的用户实现一些角色。

我通过 artisan 创建了一个中间件并为其编写了代码。

我遇到的问题是将我的中间件分配给特定的路由。 首先,我将这一行添加到 Kernel.php 中的 $routeMiddleware-array: 'role' => \App\Http\Middleware\RolesMiddleware::class,.

我的 routes/web.php-文件看起来像这样:

// Member area
Route::group(['prefix' => 'member', 'middleware' => ['auth', 'role']], function() {
    Route::get('dashboard', ['as' => 'dashboard', 'uses' => function () {
        return view('member.dashboard');
    }]);

    Route::group(['prefix' => 'user'], function() {
        Route::get('showUsers',[
            'uses' => 'UserController@showUsers',
            'as' => 'manageUsers',
            'roles' => 'manageUsers'
        ]);
    });
});

首先,我在第一组中只有 'auth' 中间件,我想将我的 'role' 中间件作为附加操作直接添加到我的 get-route 上,例如 middleware => 'role:manageUsers'。在这种情况下,我的中间件完全被忽略了,在任何情况下都没有被调用。

在将中间件放入数组之后,就像上面的代码一样,它至少被调用了。

现在我尝试向我的 get-route 添加一个自定义操作 'roles',其值为 'managerUsers'。中间件仍然被调用,如果通过 var_dump(request->route()->getAction()); 输出操作,我看到操作 'uses' 和 'as' 但不是我的自定义操作 'roles'.

我完全不知道出了什么问题。有谁知道是否无法向特定路由添加自定义操作或额外的中间件?

此致。

编辑 1 (17.07.2017)

我的 \app\Http\Middleware\RolesMiddleware.php 看起来像这样:

namespace App\Http\Middleware;

use Closure;

class RolesMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param \string[] ...$roles
     * @return mixed
     */
    public function handle($request, Closure $next, string ...$roles)
    {
        var_dump($roles);
        die('middleware reachted');
    }
}

我的 \app\Http\Kernel.php 看起来像这样:

...
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'role' => \App\Http\Middleware\RolesMiddleware::class,
];
...

我的 \routes\web.php 看起来像这样:

...
Route::group(['prefix' => 'member', 'middleware' => ['auth', 'role']], function() {
    ...
    Route::group(['prefix' => 'user'], function() {
        Route::get('showUsers',[
            'uses' => 'UserController@showUsers',
            'as' => 'manageUsers'
        ]);
    });
});
...

如果我将我的中间件与 "auth" 中间件一起分配为一个数组,我的中间件将被调用。关键是,我想定义用户在特定路线上必须具有的角色。 (在这种情况下 Route::get(...))

如果我不将我的中间件与 "auth" 中间件一起分配(例如,在前缀为 "user" 的组中),它将被完全忽略。如果我直接用 get-route 分配我的中间件也是一样的。

Route::group(['prefix'=>'user', 'middleware'=>'role:manageUsers'], function() {
    Route::get('/showUsers',[
        'uses' => 'UserController@showUsers',
        'as' => 'manageUsers'
    ]);
});

你的RolesMiddleware.php:

class RolesMiddleware{

    public function handle($request, Closure $next, ...$roles){
        // sent arguments are stored in $roles array
        print_r($roles); // Array ( [0] => manageUsers )
    }

}

你有没有在你的kernel.php中注册你的中间件?

此致...

和往常一样,问题出在 PC 前面。

我复制了更多路线以备后用,但忘记更改操作数组中 'as' 的值。

因为我在模板中使用 'as' 键的值来查找正确的页面,所以我被另一条预期的路线重定向了。遗憾的是,这个指向相同的控制器和动作,我没有注意到浏览器地址栏中的错误 URL。

我的角色中间件按预期工作,但我只是访问了错误的页面。