根据中间件组解决重复路由

时间:2016-10-16 21:55:47

标签: laravel laravel-5.3

web.php我有两个用户角色的中间件组 - adminsnon_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');
});

adminnon_admin中间件分别检查Auth::user()的角色是admin还是non_admin;如果不是,则中间件以abort(403)失败。 为什么我没有一个中间件?要分开这两个角色,以便每个角色都有自己的独立控制器逻辑和自己的视图

问题

如果我以admin身份登录,我会收到403,如果我以non_admin身份登录,则按预期工作。我的猜测:Laravel看到了两个重复的路由,并且只解析了最后定义的路径(恰好在['middleware' => ['auth', 'non_admin']]中)。

问题

如何解决重复路由但分离控制器和表示逻辑?同样,adminnon_admin用户将访问相同的路由(' /'),但会看到两个不同的视图。 我也想在两个不同的控制器中实现它。

1 个答案:

答案 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 = []);
    });
});