在web.php
我有两个用户角色的中间件组 - admins
和non_admins
:
Route::group(['middleware' => ['auth', 'admin']], function () {
// if user is logged in AND has a role of admin...
Route::get('/', 'Admin\IndexController@index');
});
Route::group(['middleware' => ['auth', 'non_admin']], function () {
// if user is logged in AND has a role of non_admin
Route::get('/', 'NonAdmin\IndexController@index');
});
admin
和non_admin
中间件分别检查Auth::user()
的角色是admin
还是non_admin
;如果不是,则中间件以abort(403)
失败。 为什么我没有一个中间件?要分开这两个角色,以便每个角色都有自己的独立控制器逻辑和自己的视图。
如果我以admin
身份登录,我会收到403,如果我以non_admin
身份登录,则按预期工作。我的猜测:Laravel看到了两个重复的路由,并且只解析了最后定义的路径(恰好在['middleware' => ['auth', 'non_admin']]
中)。
如何解决重复路由但分离控制器和表示逻辑?同样,admin
和non_admin
用户将访问相同的路由(' /'),但会看到两个不同的视图。 我也想在两个不同的控制器中实现它。
答案 0 :(得分:0)
嗯....
我个人会将所有内容封装在一个公共控制器下,并使用服务类执行必要的检查和修改。
但是如果真的希望根据你的角色将所有内容分开保存在两个不同的控制器下,你就可以这样做。这假定您使用的是Laravel's built-in Authorization:
<强> 路由 强>
Route::group(['middleware' => ['auth']], function () {
Route::get('/', function(){
$isAdmin = Auth::user()->can('do-arbitrary-admin-task');
$ns = $isAdmin ? 'Admin' : 'NonAdmin';
$controller = app()->make("{$ns}\\IndexController");
return $controller->callAction('index', $parameters = []);
});
});