ge-tracker / laravel-redis-paginator
从Redis有序集合创建Laravel分页器或LengthAwarePaginator
Requires
- php: ^8.0
- illuminate/redis: ^8.0|^9.0|^10.0
- illuminate/support: ^8.0|^9.0|^10.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.6
- gtjamesa/php-standards: ^2.0
- laravel/legacy-factories: ^1.0.4
- orchestra/testbench: ^6.0|^7.0|^8.0
- phpunit/phpunit: ^9.0
README
是否希望在大规模上显示分页的有序集合?这将是游戏排行榜或大型用户网站的绝佳示例。此包将创建一个从Redis有序集合生成的Laravel LengthAwarePaginator
。由于有序集合始终是有序的,因此它允许大量记录进行分页,同时开销很小。
安装
您可以通过composer安装此包
composer require ge-tracker/laravel-redis-paginator
用法
通过依赖注入或提供的RedisPaginator
外观来初始化分页器。下面的示例将交互leaderboard
有序集合。我们利用Laravel的Redis接口,它将尊重你在应用程序上配置的任何前缀和集群选项。
以下是分页有序集合操作的示例
public function index(LaravelRedisPaginator $redisPaginator) { $users = $redisPaginator->perPage(25)->paginate('leaderboard'); return view('leaderboard', compact('users')); }
排序
sortAsc
和sortDesc
方法允许你选择返回结果顺序。默认排序是升序。
$usersAsc = $redisPaginator->sortAsc()->paginate('leaderboard'); $usersDesc = $redisPaginator->sortDesc()->paginate('leaderboard');
获取用户的排名和页面
你可能想显示用户在有序集合中的排名,以及跳转到包含他们名字的页面的链接。这可以通过使用rank()
方法来实现。将返回一个包含score
、rank
和page
属性的MemberRank
对象。
public function show(User $user, LaravelRedisPaginator $redisPaginator) { $memberRank = $redisPaginator->rank('user:' . $user->id, 'leaderboard'); dump($memberRank->score, $memberRank->rank, $memberRank->page); }
使用外观
对于那些更喜欢外观而不是依赖注入的用户,此选项也适用
public function index() { $users = RedisPaginator::perPage(25)->paginate('leaderboard'); return view('leaderboard', compact('users')); }
选择要查看的页面
可以通过使用page()
方法或使用方法参数来设置当前页面。在底层,该包使用Laravel默认的Paginator
的页面解析,这意味着页面也可以通过查询字符串指定。
// Using the fluent interface $users = $redisPaginator->page(5)->paginate('leaderboard'); // Using method parameters $users = $redisPaginator->paginate('leaderboard', 'page', 5); // https://www.example.com/leaderboard?page=5 $users = $redisPaginator->paginate('leaderboard');
解析Eloquent模型
由于Redis是一个内存数据结构存储,而不是关系型数据库,因此与你的分页数据(例如leaderboard?)相关的实际数据可能并不完全存储在Redis中。在获取分页结果后,你需要加载数据,此包将为你处理。
在此示例中,我们假设你以以下格式存储数据
首先,创建一个Redis解析器。这可以放置在应用程序的任何位置,例如app/RedisResolvers/UserResolver.php
。
$modelKey
属性应与用于生成Redis成员的键相对应。这通常是id
或uuid
。$scoreField
属性定义了将映射到你的Eloquent模型或合并到结果数组中的字段。
<?php namespace App\RedisResolvers; use App\User; use GeTracker\LaravelRedisPaginator\Resolvers\AbstractResolver; class UserResolver extends AbstractResolver { // Defaults shown below, can be omitted protected $modelKey = 'id'; protected $scoreField = 'score'; /** * Load Eloquent models */ protected function resolveModels(array $keys) { return User::whereIn('id', $keys)->get(); } /** * Resolve a key from Redis to an Eloquent incrementing ID or UUID */ protected function resolveKey($key) { return (int)str_replace('user:', '', $key); } }
resolveKey()
方法将接受一个键(Redis成员),并允许你对其进行转换。在上面的示例中,我们在将字符串转换为整数之前,从字符串中移除了user:
。
然后,你可以定义resolveModels()
,它接受一个要查询的已解析键数组。
最后,我们必须在运行查询之前设置我们的模型解析器
$users = $this->paginator ->setModelResolver(new \App\RedisResolvers\UserResolver()) ->paginate('leaderboard');
现在,我们可以访问完整的用户模型,以及从Redis加载的分数
echo $users[0]->name . ' -> ' . $users[0]->score;
测试
composer test
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件james@ge-tracker.com联系,而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。