如何创建动态路由?

How can I create dynamic routes?

我有这条路:

http://localhost:8000/home

我想当普通用户打开上面的路径时,我调用这个控制器:

mainPage@index

但是当管理员打开那个路径时,我调用这个控制器:

panelPage@index

如您所见,我正在寻找 "dynamic routes" 有点……是否可以实施?换句话说,我可以为管理员和普通会员调用两个不同的控制器吗?

这是使用 Middlewares 过滤 HTTP 请求的好案例。

你也可以在你的路由文件中做一些有条件的事情,比如:

if (Auth::user()->isAdmin()){
    Route::get('/', 'panelPage@index');
} 
else {
    Route::get('/', 'mainPage@index');
}

根据您的应用程序的外观,您可以在用户模型中定义 isAdmin()。这是一个非常简单的示例,您有一个名为 role_id 的列并且 id nr 1 等于 admin。如果通过身份验证的用户是admin,则显示true,否则显示false:

public function isAdmin()
    {
       return Auth::user()->role_id == 1;
    }

一种更动态和更高级的方法是创建一个角色 table,并使用 role_user 枢轴 table 将角色与用户相关联。

如果您希望它更进一步,您可以创建一个权限 table 并将该角色与具有 permission_role 枢轴 table 的权限相关联。然后您可以在您的应用程序中定义需要一个权限才能执行操作并添加给定用户角色在该数据透视表中具有的所有权限 table。然后您只需检查用户(具有特定角色)是否具有给定的权限。

为了获得最佳实践,您可以使用 Middleware 对路由和控制器进行整理和分类。

在这种相对简单的情况下,您还可以使用类似这样的内容(在您的路由文件中):

if(!is_null(Auth::user()))  {
  // first check if user is logged in, else Auth::user() will return null
  $uses = 'mainPage@index';
  if(Auth::user()->admin) {
    $uses = 'panelPage@index';
  }
  Route::get('/', $uses);
}

更新

或者您可以将所有内容包装在 auth 中间件组中的 if 语句中,如下所示:

Route::group(['middleware' => ['auth']], function(){
   $uses = 'mainPage@index';
    if(Auth::user()->admin) {
     $uses = 'panelPage@index';
    }
    Route::get('/', $uses);
});

还要确保您的用户 table 有一个名为 'admin' 的列。