Laravel 5.4 如何使用中间件设置两个路由组
How to setup two route groups using middleware in Laravel 5.4
我正在设置一个 Web 应用程序,我想在其中区分两个路由组。两个小组都按预期单独工作,但合并后其中一个会失败。我查看了 L5.4 网站上的文档并按照说明进行操作。挖了一整天决定问你。
这是我的 routes/web.php 文件:
Route::group(['middleware' => ['auth']], function () {
Route::group(['middleware' => ['medewerker']], function () {
Route::get('/urencorrectie','UrenRegelsController@urencorrectie');
});
Route::group(['middleware' => ['officemanager']], function () {
Route::get('/', 'DashboardController@index');
Route::post('/', 'DashboardController@index');
Route::get('/profile', function(){
return view('profile');});
});
});
Auth::routes();
Route::get('/home', 'HomeController@index');
为了启用角色,我向用户模型添加了一个列 Rolid。角色 1 是办公室经理,角色 3 是员工。
然后在后面的中间件中我们找到employee.php:
namespace App\Http\Middleware;
use Closure;
use Auth;
class Employee
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->Rolid=='3')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
中间件 officemanager.php 文件包含:
namespace App\Http\Middleware;
use Closure;
use Auth;
class Officemanager
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user=Auth::user();
if(Auth::user()->Rolid=='1')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
原样的代码产生以下结果:
- 当 Officemanager 登录时,he/she 被重定向到正确的路径。一切正常。
- 当员工登录时,he/she 被重定向到 /home 重定向(routing/web.php 文件的底部)。
非常欢迎任何线索或帮助。有点停留在一些可能是基本的东西上。
[更新]
在 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,
'officemanager' => \App\Http\Middleware\Officemanager::class,
'employee' => \App\Http\Middleware\Employee::class,
];
我唯一能想到的是employee的Rolid
不是3 - 所以尝试调试它。
一般来说,不建议在您的代码中依赖数据库 ID,因为它们会在环境之间发生变化。我会为 user
模型添加一个关系并检查角色名称:
User model:
public function role()
{
return $this->belongsTo('App\Role', 'Rolid');
}
员工中间件
class Employee
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->role->name == 'employee')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
Office manger 中间件:
class Officemanager
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->role->name == 'officemanager')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
我正在设置一个 Web 应用程序,我想在其中区分两个路由组。两个小组都按预期单独工作,但合并后其中一个会失败。我查看了 L5.4 网站上的文档并按照说明进行操作。挖了一整天决定问你。
这是我的 routes/web.php 文件:
Route::group(['middleware' => ['auth']], function () {
Route::group(['middleware' => ['medewerker']], function () {
Route::get('/urencorrectie','UrenRegelsController@urencorrectie');
});
Route::group(['middleware' => ['officemanager']], function () {
Route::get('/', 'DashboardController@index');
Route::post('/', 'DashboardController@index');
Route::get('/profile', function(){
return view('profile');});
});
});
Auth::routes();
Route::get('/home', 'HomeController@index');
为了启用角色,我向用户模型添加了一个列 Rolid。角色 1 是办公室经理,角色 3 是员工。
然后在后面的中间件中我们找到employee.php:
namespace App\Http\Middleware;
use Closure;
use Auth;
class Employee
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->Rolid=='3')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
中间件 officemanager.php 文件包含:
namespace App\Http\Middleware;
use Closure;
use Auth;
class Officemanager
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user=Auth::user();
if(Auth::user()->Rolid=='1')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
原样的代码产生以下结果: - 当 Officemanager 登录时,he/she 被重定向到正确的路径。一切正常。 - 当员工登录时,he/she 被重定向到 /home 重定向(routing/web.php 文件的底部)。
非常欢迎任何线索或帮助。有点停留在一些可能是基本的东西上。
[更新]
在 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,
'officemanager' => \App\Http\Middleware\Officemanager::class,
'employee' => \App\Http\Middleware\Employee::class,
];
我唯一能想到的是employee的Rolid
不是3 - 所以尝试调试它。
一般来说,不建议在您的代码中依赖数据库 ID,因为它们会在环境之间发生变化。我会为 user
模型添加一个关系并检查角色名称:
User model:
public function role()
{
return $this->belongsTo('App\Role', 'Rolid');
}
员工中间件
class Employee
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->role->name == 'employee')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}
Office manger 中间件:
class Officemanager
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->role->name == 'officemanager')
{
return $next($request);
}
else
{
return redirect('/home');
}
}
}