自己的 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。
我的角色中间件按预期工作,但我只是访问了错误的页面。
就在几周前,我开始 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。
我的角色中间件按预期工作,但我只是访问了错误的页面。