【发布时间】:2017-07-16 10:48:00
【问题描述】:
就在几周前,我开始使用 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”中间件,我想将我的“角色”中间件作为附加操作直接添加到我的 get-route 上,例如 middleware => 'role:manageUsers'。在这种情况下,我的中间件被完全忽略并且在任何情况下都没有被调用。
在将中间件放入数组之后,就像上面的代码一样,它至少被调用了。
现在我尝试将值为“managerUsers”的自定义操作“角色”添加到我的 get-route。中间件仍会被调用,如果通过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 也是一样的。
【问题讨论】:
标签: laravel laravel-5.4 middleware php-7