请问有这么一个登录未登录获取不同分类列表怎么解决

老师你好,
假如这边一个分类列表接口A,
当用户未登录的时候是查看一部分分类B,
当用户登录后查看的是分类B再加上一些特殊的分类C,
那么这个分类列表该怎么设计比较优雅

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

@jake_zou 根据token呀。。
app/Http/Controllers/Api/CategoriesController.php

    public function index()
    {
        dd($this->user());
        //return $this->response->collection(Category::all(), new CategoryTransformer());
        return $this->response->collection(Category::categories_via_api_auth(), new CategoryTransformer());
    }
  • 有token
    file

  • 无token:

file

源码分析

根据token去获取id,根据id去获取user
vendor/tymon/jwt-auth/src/JWTAuth.php

    /**
     * Authenticate a user via a token.
     *
     * @return \Tymon\JWTAuth\Contracts\JWTSubject|false
     */
    public function authenticate()
    {
        $id = $this->getPayload()->get('sub');

        if (! $this->auth->byId($id)) {
            return false;
        }

        return $this->user();
    }
5年前 评论
讨论数量: 9
  • 在\App\Models\Category中增加一个自定义方法,如下
    public static function categories_via_api_auth()
    {
        $user = app(Auth::class)->user();
        if ($user) {
            return static::query()->where('id', '>', 1)->get();
        } else {
            return static::query()->where('id', 1)->get();
        }
    }
  • 修改 \App\Http\Controllers\Api\CategoriesController::index,如下:
    public function index()
    {
        //return $this->response->collection(Category::all(), new CategoryTransformer());
        return $this->response->collection(Category::categories_via_api_auth(), new CategoryTransformer());
    }
  • 效果图
    file
    file
5年前 评论
  • 在\App\Models\Category中增加一个自定义方法,如下
    public static function categories_via_api_auth()
    {
        $user = app(Auth::class)->user();
        if ($user) {
            return static::query()->where('id', '>', 1)->get();
        } else {
            return static::query()->where('id', 1)->get();
        }
    }
  • 修改 \App\Http\Controllers\Api\CategoriesController::index,如下:
    public function index()
    {
        //return $this->response->collection(Category::all(), new CategoryTransformer());
        return $this->response->collection(Category::categories_via_api_auth(), new CategoryTransformer());
    }
  • 效果图
    file
    file
5年前 评论

@hustnzj 感谢,这样的想法是可以的,
但是请问这个api是属于需要登录的还是属于不需要登录?

  • 如果放到需要登录的group中,未登录用户肯定访问不了
  • 如果放到不需要登录的group中,那么 auth 这个中间件还会生效吗
5年前 评论

@liyu001989

还是想听老师的讲解

5年前 评论

当然是不需要登录就可以访问此接口的呀,要实现是否登录都可以访问,api.auth这个中间件就不需要使用了吧。api.auth 这个中间件的作用也就是需要带token才能访问。

5年前 评论
liyu001989

@jake_zou

放在不需要验证的 group 中。

“auth 中间件还会生效吗” 是啥意思,controller 中使用 $this->user() 可以获取用户

5年前 评论

@hustnzj
@liyu001989

没有经过中间件,那 $this->user() 根据什么判断当前用户

5年前 评论

@jake_zou 根据token呀。。
app/Http/Controllers/Api/CategoriesController.php

    public function index()
    {
        dd($this->user());
        //return $this->response->collection(Category::all(), new CategoryTransformer());
        return $this->response->collection(Category::categories_via_api_auth(), new CategoryTransformer());
    }
  • 有token
    file

  • 无token:

file

源码分析

根据token去获取id,根据id去获取user
vendor/tymon/jwt-auth/src/JWTAuth.php

    /**
     * Authenticate a user via a token.
     *
     * @return \Tymon\JWTAuth\Contracts\JWTSubject|false
     */
    public function authenticate()
    {
        $id = $this->getPayload()->get('sub');

        if (! $this->auth->byId($id)) {
            return false;
        }

        return $this->user();
    }
5年前 评论

@hustnzj
感谢感谢
论读源码的重要性

5年前 评论

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