Laravel 对不同的控制器重用 URI

Laravel reuse URIs with different controllers

我正在玩 Laravel 5.3 中的一个副项目。我有不同的用户类型(例如管理员、学生等),它们是用户模型的属性:

$user->account_type; // administrator

每种用户类型都有自己的仪表板(和其他控制器),以及它们的命名空间:

Controllers\Administrator\DashboardController;
Controllers\Student\DashboardController;

我所有的控制器和视图等都基于帐户类型命名空间。

我希望每个用户(无论类型)都能够执行 domain.com/dashboard 并被重定向到他们的帐户特定控制器。

但是laravel只识别路由文件中最后一个重复的uri。我通读了 Router.phpRouteCollection.php 文件,这似乎是因为 URI 作为键存储在数组中,如果您尝试重用它,它总是会被覆盖。

我看到另一个线程有人尝试过这个,我不想有一个带有 IF 的控制器(像这样):

public function index()
{
    if ($request->user()->account_type == 'administrator') {
        /** **/
    } elseif ... {
    }
}

我不想为重用的 uri 使用单个控制器的原因是我只重用了一些 URI。例如仪表盘。我希望事情保持一致,并且我不想在必须重用的每个控制器方法中都进行帐户检查。

我试过在中间件中限制路由的加载,但是只能在中间件中抛出异常,不能说"Ignore this group if the middleware fails"。

希望我已经解释得足够好,但如果需要更多信息,请发表评论并告诉我。

我的问题是:

  1. 如何为不同的控制器重用相同的 URI

  2. 在路由过程中什么时候检索经过身份验证的用户?

1) 与选项一样,您仍然可以在路由文件中重定向用户以保持控制器清晰:

\Route::get("dashboard", function(){
    switch(\Auth::user()->account_type){
        case 'admin':
          return (new \App\Http\Controllers\Admin\DashboardController)->index();
        break;

        case 'student':
          return (new \App\Http\Controllers\Student\DashboardController)->index();
        break;
    }
});

2) 我想用户在访问仪表板时已经通过身份验证 URL,因此您可以使用 \Auth::user()

获取它