我在Laravel 5.3中玩一个侧面项目。我有不同的用户类型(例如管理员,学生等),它们是用户模型的属性:
$user->account_type; // administrator
每个用户类型都有自己的仪表板(和其他控制器)及其命名空间:
Controllers\Administrator\DashboardController;
Controllers\Student\DashboardController;
我的所有控制器和视图等都根据帐户类型进行了命名空间。
我希望每个用户(无论类型)能够执行domain.com/dashboard
并重定向到他们的帐户特定控制器。
但是laravel只识别路径文件中的最后一个重复的uri。我通读Router.php
和RouteCollection.php
文件,似乎是因为URI存储为数组中的键,如果您尝试重用它,它将永远被覆盖。
我见过另一个尝试过这个问题的人,我不希望在其中安装一个带IF的控制器(如下):
public function index()
{
if ($request->user()->account_type == 'administrator') {
/** **/
} elseif ... {
}
}
我不希望单个控制器用于重用uri的原因是因为我只重用了一些URI。例如仪表板。我希望事情一致,我不想在我必须重用的每个控制器方法中进行帐户检查。
我试图限制中间件中路由的加载,但我只能在中间件中抛出异常,我不能说“如果中间件失败则忽略该组”。
希望我已经解释得很好,但如果需要进一步的信息,请发表评论并告诉我。
我的问题是:
如何为不同的控制器重用相同的URI
在路由过程中,是否已检测到经过身份验证的用户?
答案 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()
来获取它