【问题标题】:Laravel reuse URIs with different controllersLaravel 使用不同的控制器重用 URI
【发布时间】:2017-01-29 03:33:09
【问题描述】:

我正在玩 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. 在路由过程中何时检索到经过身份验证的用户?

【问题讨论】:

    标签: php laravel routing laravel-5.3 middleware


    【解决方案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()

    获取它

    【讨论】:

    • 感谢@lifekent 甚至没有想到这个选项,我认为这将是目前解决我问题的最佳方法:)
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多