Laravel Passport 使用缓存优化记录

由于 Passport 不停的查询数据库, 为了那些性能, 从而使用redis进行缓存
特将修改的过程记录一下. 如有不对的地方, 欢迎各位能够指出错误

  1. 新增一个 ClientRepository 继承于 Laravel\Passport\ClientRepository 改写 find() 方法
<?php


namespace App\Repositories;

use Illuminate\Support\Facades\Cache;
use Laravel\Passport\ClientRepository AS BaseClientRepository;
use Laravel\Passport\Passport;

class ClientRepository extends BaseClientRepository
{
    /**
     * Get a client by the given ID.
     *
     * @param  int  $id
     * @return \Laravel\Passport\Client|null
     */
    public function find($id)
    {
        return Cache::remember("passport:client:{$id}", 86400, 
            function () use ($id) {
                $client = Passport::client();
                return $client->where($client->getKeyName(), $id)->first();
            }
        );
    }
}
  1. 新增一个 TokenRepository 继承于 Laravel\Passport\TokenRepository 改写 find() 方法
<?php


namespace App\Repositories;

use Illuminate\Support\Facades\Cache;
use Laravel\Passport\Passport;
use Laravel\Passport\TokenRepository AS BaseTokenRepository;

class TokenRepository extends BaseTokenRepository
{
    /**
     * Get a token by the given ID.
     *
     * @param  string  $id
     * @return \Laravel\Passport\Token
     */
    public function find($id)
    {
        return Cache::remember("passport:token:{$id}", 86400, 
            function () use ($id) {
                return Passport::token()->where('id', $id)->first();
            }
        );
    }
}
  1. App\Providers 新增 PassportServiceProvider
<?php

namespace App\Providers;

use App\Repositories\ClientRepository;
use App\Repositories\TokenRepository;
use Laravel\Passport\PassportServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;

class PassportServiceProvider extends ServiceProvider
{

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerTokenRepository();

        parent::register();
    }

    /**
     * Register the client repository.
     *
     * @return void
     */
    protected function registerClientRepository()
    {
        $this->app->singleton('Laravel\Passport\ClientRepository', function ($container) {
            $config = $container->make('config')->get('passport.personal_access_client');
            return new ClientRepository($config['id'] ?? null, $config['secret'] ?? null);
        });
    }

    /**
     * Register the client repository.
     *
     * @return void
     */
    protected function registerTokenRepository()
    {
        $this->app->singleton('Laravel\Passport\TokenRepository', function ($container) {
            return new TokenRepository();
        });
    }

}
  1. config/app.phpproviders 添加 App\Providers\PassportServiceProvider::class 后就可以使用redis进行数据缓存了

关于其他的操作, 请根据自己的实际情况去处理, 当前只做最简单的缓存操作.

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16
circle

可以试下这个拓展,实现思路基本类似

3年前 评论
小学毕业生 (楼主) 3年前

可以跟 smartins/passport-multiauth 这个多表认证的包混用吗,这个他会多一个迁移表

2年前 评论

有什么其他问题吗? laravel 5.8 适用吧?

1年前 评论
小学毕业生 (楼主) 1年前
yzbfeng (作者) 1年前
小学毕业生 (楼主) 1年前
yzbfeng (作者) 1年前
小学毕业生 (楼主) 1年前
yzbfeng (作者) 1年前
小学毕业生 (楼主) 1年前
小学毕业生 (楼主) 1年前
小学毕业生 (楼主) 1年前
yzbfeng (作者) 1年前
yzbfeng (作者) 1年前

再来打扰下哈

按文中的方法, 只是套了层cache再查询的地方;

那是不是再 RevokeOldTokens 这个监听器中以及登出的时候,删除缓存(原本应该只要删除数据库就好了),还是说已经自动处理了? 望解答

1年前 评论

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