如何创建动态路由?

时间:2016-10-23 10:32:13

标签: php laravel routing acl

我有这条道路:

http://localhost:8000/home

我希望当普通用户打开上面的路径时,我会调用此控制器:

mainPage@index

但是当管理员打开该路径时,我会调用此控制器:

panelPage@index

所以如你所见,我正在寻找“动态路线”有点......实现可能吗?换句话说,我可以为管理员和普通会员调用两个不同的控制器吗?

2 个答案:

答案 0 :(得分:2)

使用Middlewares过滤HTTP请求是个好例子。

您还可以在路线文件中执行某些条件操作,例如:

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

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

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

更加动态和高级的方法是创建角色表,并使用role_user数据透视表将角色与用户相关联。

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

答案 1 :(得分:1)

为了获得最佳实践,您可以使用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);
}

<强>更新

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

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

另外,请确保您的users表中有一个名为&#39; admin&#39;。

的列