Laravel Passport 使用缓存优化记录
由于 Passport 不停的查询数据库, 为了那些性能, 从而使用redis进行缓存
特将修改的过程记录一下. 如有不对的地方, 欢迎各位能够指出错误
- 新增一个
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();
}
);
}
}
- 新增一个
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();
}
);
}
}
- 在
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();
});
}
}
- 在
config/app.php
中providers
添加App\Providers\PassportServiceProvider::class
后就可以使用redis进行数据缓存了
关于其他的操作, 请根据自己的实际情况去处理, 当前只做最简单的缓存操作.
本作品采用《CC 协议》,转载必须注明作者和本文链接
可以试下这个拓展,实现思路基本类似
可以跟 smartins/passport-multiauth 这个多表认证的包混用吗,这个他会多一个迁移表
有什么其他问题吗? laravel 5.8 适用吧?
再来打扰下哈
按文中的方法, 只是套了层cache再查询的地方;
那是不是再 RevokeOldTokens 这个监听器中以及登出的时候,删除缓存(原本应该只要删除数据库就好了),还是说已经自动处理了? 望解答