Skip to content

Token、ID 与缓存

Pin 将 Token、ID 生成和 Redis Hash Cache 放在独立模块里,适合认证、分布式 ID、权限缓存和业务热点数据。

Token

Token 门面:

php
use Pin\Support\Facades\Token;

$token = Token::encode([
    'uid' => 1001,
], expires: 7200);

$payload = Token::decode($token)->payload;

也可以选择指定 driver:

php
$jwt = Token::driver('jwt')->encode(['uid' => 1001], 7200);
$session = Token::driver('session')->encode(['uid' => 1001]);

Token Driver

内置三种 driver:

Driver特点
aesAES 加密 payload,无状态,适合内部系统和简单认证
jwt基于 firebase/php-jwt,适合标准 JWT 对接
session基于 Cache 的有状态 Token,支持主动失效、滑动过期和最大生命周期

配置示例:

php
return [
    'default' => 'default',

    'drivers' => [
        'default' => [
            'driver' => 'aes',
        ],

        'jwt' => [
            'driver' => 'jwt',
            'algo' => 'HS256',
            // 'key' => env('JWT_KEY'),
        ],

        'session' => [
            'driver' => 'session',
            'expires' => 7200,
            'cache_prefix' => 'token:',
            'refresh_before' => 600,
            'max_age' => 86400,
        ],
    ],
];

Session Token 注销:

php
Token::driver('session')->forget($token);

自定义 Token Driver

php
use Pin\Support\Facades\Token;

Token::extend('custom', function ($app, array $config) {
    return new Pin\Token\TokenFactory(new CustomTokenDriver($config));
});

自定义底层 driver 需要实现 Pin\Token\Contracts\TokenDriver

ID 生成

统一入口:

php
use Pin\IdGenerator\Id;
use Pin\IdGenerator\IdGenerator;

$id = Id::generate();
$ids = Id::generate(10);

$snowflake = Id::generate(generator: IdGenerator::Snowflake);

内置生成器:

生成器配置 key说明
Timestamptimestamp基于时间戳的趋势递增 ID
Redisredis基于 Redis INCR 的全局递增 ID
Snowflakesnowflake基于 Snowflake 的分布式 ID

默认生成器由 config('id-generator.default') 控制。

模型 ID Trait

模型层提供多个 ID 相关 trait:

  • Pin\Models\Concerns\TimestampId
  • Pin\Models\Concerns\RedisId
  • Pin\Models\Concerns\SnowflakeId
  • Pin\Models\Concerns\GeneratorId

树模型默认使用 RedisId

Redis Hash Cache

HashCache 代理到 Laravel cache store redis-hash

php
use Pin\Support\Facades\HashCache;

HashCache::put('users:1', ['name' => 'Pin'], 3600);
$user = HashCache::get('users:1');

$all = HashCache::getAll('users');
HashCache::del('users');

HashKey 使用最后一个 : 拆分 hash key 和 field:

text
users:1

会被解析为:

text
hash key: users
field: 1

配置:

php
'stores' => [
    'redis-hash' => [
        'driver' => 'redis-hash',
        'store' => 'redis-hash',
        'connection' => 'cache',
        'ttl' => 604800,
    ],
],