虚心请教各位大佬们一个很常见的问题。

有一个场景,不同的用户登录到后台,权限不同看到的数据就不同。
比如,班主任登录后台,只能看到本班学生的具体信息。年级主任登录后台,有一个下拉框,可以选择某个班,看具体班的信息。
写接口的时候,我是每个接口都去判断了当前用户的角色。虽然功能实现了,但是感觉就很不好,代码都重复了。
然后想着在一个公共控制器或者调用公共方法去获取用户角色,但是感觉还是避免不了在每个接口中都实现类似于以下的代码。

public function list(Request $request) {
    //获取当前用户权限
    $roleId = $this->getRoleId();//获取权限的代码写在公共方法或者公共控制器下
    if($roleId == 1) {
        //班主任,只能查看自己班级的学生数据
        $userInfo = Auth::guard('api')->user();
        $classId = $userInfo->class_id;
    }else{
        //年级主任,可以通过下拉框筛选该年级下的所有班级
        $class = $request->input('class_id') ?? 1;//默认查看1班的学生数据
    }
}

兄弟们,请问有没有办法可以更优雅的实现这种功能?因为一个页面要调用很多接口,每个接口前面都写这么一段,感觉太不好了

@ZLSN
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

限制查询: 考虑模型的全局作用域

让模型自动去做,自己别操心那种事情。

public function apply(Builder $builder, Model $model)
{
   $class_id = request()->class_id;
   if( 班主任)
   $class_id = Auth::guard('api')->user()->class_id;
   return $query->where('class_id', $class_id);
}
4年前 评论
ZLSN (楼主) 4年前
讨论数量: 6

中间件是个好东西

4年前 评论
ZLSN (楼主) 4年前

限制查询: 考虑模型的全局作用域

让模型自动去做,自己别操心那种事情。

public function apply(Builder $builder, Model $model)
{
   $class_id = request()->class_id;
   if( 班主任)
   $class_id = Auth::guard('api')->user()->class_id;
   return $query->where('class_id', $class_id);
}
4年前 评论
ZLSN (楼主) 4年前

将检索条件抽象化,过滤条件集成在一起,github.com/Tucker-Eric/EloquentFil...
这个包很好用,你可以把你这个流程封装一下!

4年前 评论
ZLSN (楼主) 4年前

中间件,把你的auth标识注入到request里面。。。

4年前 评论
ZLSN (楼主) 4年前

直接在User模型里面封装一个方法 getClass() 根据用户的id和权限返回对应的班级资源,每个控制器里面直接调用即可。

4年前 评论
ZLSN (楼主) 4年前

2楼最优解

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!