Laravel重用具有不同控制器的URI

时间:2017-01-29 03:33:10

标签: php laravel routing laravel-5.3 middleware

我在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。例如仪表板。我希望事情一致,我不想在我必须重用的每个控制器方法中进行帐户检查。

我试图限制中间件中路由的加载,但我只能在中间件中抛出异常,我不能说“如果中间件失败则忽略该组”。

希望我已经解释得很好,但如果需要进一步的信息,请发表评论并告诉我。

我的问题是:

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

  2. 在路由过程中,是否已检测到经过身份验证的用户?

1 个答案:

答案 0 :(得分:1)

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()

来获取它