【问题标题】:How can I create dynamic routes?如何创建动态路由?
【发布时间】:2016-10-23 10:32:12
【问题描述】:

我有这条路:

http://localhost:8000/home

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

mainPage@index

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

panelPage@index

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

【问题讨论】:

  • 是的,这是可能的。您可以创建中间件组。你在使用 Laravel 的身份验证吗?您是否已经创建了类似 AdminMiddleware 的东西?
  • @JanWillem 我了解当前用户是管理员还是普通会员,如下所示:@if( Auth::user()->admin ) { // admin } else { // regular member }

标签: php laravel routing acl


【解决方案1】:

这是使用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;
    }

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

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

【讨论】:

  • 它会抛出这个错误:Call to a member function isAdmin() on null
  • isAdmin 在这种情况下只是一个示例,您需要定义“isAdmin()”是什么。如何定义它取决于您如何设计应用程序。如果您在 users 表中有一个“role_id”,那么您可以创建一个名为 isAdmin() 的方法来检查相应的 role_id 是否是管理员之一。因此,当您调用 isAdmin() 时,您会检查用户是否具有正确的 role_id。我会用一个例子来更新答案。
【解决方案2】:

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

还要确保您的用户表有一个名为“admin”的列。

【讨论】:

  • 你的代码抛出这个错误:ErrorException in routes.php line 18: Trying to get property of non-object
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 2022-11-12
  • 2023-04-11
  • 2019-09-09
  • 2018-09-19
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多