根据用户角色检索db记录

时间:2018-01-25 12:57:14

标签: laravel-5.5

我是Laravel的新手,这就是为什么我很确定我的想法是错误的。到了这一步......

我正在构建Laravel应用程序。

我拥有的其他内容:

  1. 用户(使用我的自定义字段使用Laravel auth构建)
  2. 角色(枢轴,多对多)
  3. 公司(每个用户属于公司(许多用户可以属于一家公司)。
  4. 地点(每家公司有很多地点)
  5. 现在我正在创建文档。目前,如果user_id或company_id将包含在文档标题中,则无关紧要。

    我需要的是有能力,例如。

    • 显示文档 - 当我转到带有ADMIN角色的文档列表的页面时,当具有USER角色的用户转到同一路径时,我将看到存储在db BUT中的所有文档...他将获得拥有的列表docs
    • 位置/编辑/ {id} - 阻止进入不具有我的ID的网址 - 这更简单,我想可以使用中间件处理

    我有3个想法:

    1. 创建一些FrontController和内部构造函数run方法,如果用户是ADMIN或USER只返回一个id,则返回所有users_ids(或所有companies_ids)。然后,应用程序中的所有控制器都会扩展此FrontController
    2. 创建服务类(最终有很多服务取决于要检索的模型),从db调用存储库获取带有role参数的记录的方法。然后在这个方法中检查应该使用哪个ID。
    3. 也许用户以某种方式使用Laravel Policies和before()方法。 Nów我正在阅读文档,但在这种情况下我真的不知道如何使用它,但我觉得这个想法也是可能的。
    4. 我觉得这些想法“很脏”。您能否提供有关如何使用代码段很好地实现此功能的信息?我认为这个主题很常见,很多人都会使用这个。我会很感激任何提示。

1 个答案:

答案 0 :(得分:0)

一种方法可能是使用本地范围。

https://laravel.com/docs/5.5/eloquent#local-scopes

Document模型上定义两个范围:

public function scopeBelongingToUser($query)
{
    return $query->where('user_id', auth()->user()->id);
}

// this is the same as doing on your User model
public function documents()
{
    $this->hasMany(Document::class);
}



public function scopeBelongingToAdmin($query)
{
    if (auth()->user()->roles->contains('admin') {
        return $query->select('*');
    }

    abort(403, 'Unauthorized');
}

然后您可以在以后使用它:

Document::belongingToUser();

Document::belongingToAdmin();