turahe / laravel-likeable
Laravel Eloquent 模型的特质,用于轻松实现“点赞”、“收藏”或“记住”功能。
Requires
- php: ^7.3|^8.0
- illuminate/database: 5.* | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0
- illuminate/support: 5.* | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.1
- mockery/mockery: ^1.3
- orchestra/testbench: ^5.0|^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^8.5|^9.3||^10.0|^11.0
This package is auto-updated.
Last update: 2024-09-01 13:57:16 UTC
README
Laravel Likeable 简化了 Eloquent 模型的点赞和踩评管理。只需一分钟,即可使任何模型支持点赞和踩评!
内容
功能
- 专为与 Laravel Eloquent 模型配合使用而设计。
- 使用合约以保持高度的定制能力。
- 使用特质以获得开箱即用的功能。
- 大部分逻辑由
LikeableService
处理。 - 包含 Artisan 命令
likeable:recount {model?} {type?}
以重新获取点赞计数。 - 可点赞模型可以拥有点赞和踩评。
- 一个模型的点赞和踩评是互斥的。
- 按点赞数获取可点赞模型的排序。
- 为
like
、unlike
、dislike
、undislike
方法提供事件。 - 遵循 PHP 标准建议
- 包含单元测试。
安装
首先,通过 Composer 引入包。
$ composer require turahe/laravel-likeable
如果您正在使用 Laravel 5.5,则可以跳过注册包的部分。
Laravel 5.4 及以下版本注册包
在 app/config/app.php
中包含服务提供者。
'providers' => [ Turahe\Likeable\LikeableServiceProvider::class, ],
执行数据库迁移
最后,您需要发布和运行数据库迁移。
$ php artisan vendor:publish --provider="Turahe\Likeable\Providers\LikeableServiceProvider" --tag=migrations
$ php artisan migrate
使用
准备可点赞模型
在模型中使用 Likeable
合约以获得点赞行为,并实现它或直接使用 Likeable
特质。
use Turahe\Likeable\Contracts\Likeable as LikeableContract; use Turahe\Likeable\Traits\Likeable; use Illuminate\Database\Eloquent\Model; class Article extends Model implements LikeableContract { use Likeable; }
可用方法
点赞
点赞模型
$article->like(); // current user $article->like($user->id);
从模型中移除点赞标记
$article->unlike(); // current user $article->unlike($user->id);
切换模型的点赞标记
$article->likeToggle(); // current user $article->likeToggle($user->id);
获取模型点赞数
$article->likesCount;
获取模型点赞计数器
$article->likesCounter;
获取点赞关系
$article->likes();
获取现有模型点赞的 Illuminate\Database\Eloquent\Collection
可迭代对象
$article->likes;
布尔值检查用户是否点赞了模型
$article->liked; // current user $article->liked(); // current user $article->liked($user->id);
首先检查预加载关系 likes
和 likesAndDislikes
。
获取点赞了模型的用户集合
$article->collectLikers();
删除模型的所有点赞
$article->removeLikes();
踩评
踩评模型
$article->dislike(); // current user $article->dislike($user->id);
从模型中移除踩评标记
$article->undislike(); // current user $article->undislike($user->id);
切换模型的踩评标记
$article->dislikeToggle(); // current user $article->dislikeToggle($user->id);
获取模型踩评数
$article->dislikesCount;
获取模型踩评计数器
$article->dislikesCounter;
获取踩评关系
$article->dislikes();
获取现有模型踩评的 Illuminate\Database\Eloquent\Collection
可迭代对象
$article->dislikes;
布尔值检查用户是否踩评了模型
$article->disliked; // current user $article->disliked(); // current user $article->disliked($user->id);
首先检查预加载关系 dislikes
和 likesAndDislikes
。
获取踩评了模型的用户集合
$article->collectDislikers();
删除模型的所有踩评
$article->removeDislikes();
点赞和踩评
获取点赞和踩评之间的差异
$article->likesDiffDislikesCount;
获取点赞和踩评关系
$article->likesAndDislikes();
获取现有模型点赞和踩评的 Illuminate\Database\Eloquent\Collection
可迭代对象
$article->likesAndDislikes;
作用域
查找用户点赞的所有文章
Article::whereLikedBy($user->id) ->with('likesCounter') // Allow eager load (optional) ->get();
查找用户踩评的所有文章
Article::whereDislikedBy($user->id) ->with('dislikesCounter') // Allow eager load (optional) ->get();
按点赞数获取可点赞模型
$sortedArticles = Article::orderByLikesCount()->get(); $sortedArticles = Article::orderByLikesCount('asc')->get();
默认按 desc
排序。
按踩评数获取可点赞模型
$sortedArticles = Article::orderByDislikesCount()->get(); $sortedArticles = Article::orderByDislikesCount('asc')->get();
默认按 desc
排序。
事件
在每次添加点赞时,都会触发 \Turahe\Likeable\Events\ModelWasLiked
事件。
在每次移除点赞时,都会触发 \Turahe\Likeable\Events\ModelWasUnliked
事件。
每当添加不喜欢时,都会触发 \Turahe\Likeable\Events\ModelWasDisliked
事件。
每当移除不喜欢时,都会触发 \Turahe\Likeable\Events\ModelWasUndisliked
事件。
控制台命令
重新计算所有模型类型的喜欢和不喜欢数量
$ likeable:recount
使用形态映射别名重新计算具体模型类型的喜欢和不喜欢数量
$ likeable:recount --model="article"
使用完全限定类名重新计算具体模型类型的喜欢和不喜欢数量
$ likeable:recount --model="App\Models\Article"
只重新计算所有模型类型的喜欢数量
$ likeable:recount --type="like"
使用形态映射别名只重新计算具体模型类型的喜欢数量
$ likeable:recount --model="article" --type="like"
使用完全限定类名只重新计算具体模型类型的喜欢数量
$ likeable:recount --model="App\Models\Article" --type="like"
只重新计算所有模型类型的不喜欢数量
$ likeable:recount --type="dislike"
使用形态映射别名只重新计算具体模型类型的不喜欢数量
$ likeable:recount --model="article" --type="dislike"
使用完全限定类名只重新计算具体模型类型的不喜欢数量
$ likeable:recount --model="App\Models\Article" --type="dislike"
扩展
您可以用自己的实现覆盖包的核心类
Models\Like
Models\LikeCounter
Services\LikeableService
注意:不要忘记,所有自定义模型都必须实现原始模型接口。
要实现这一点,您应该在应用程序服务提供者中使用容器 绑定接口到实现。
使用模型类的自身实现
$this->app->bind( \Turahe\Likeable\Contracts\Like::class, \App\Models\CustomLike::class );
使用服务类的自身实现
$this->app->singleton( \Turahe\Likeable\Contracts\LikeableService::class, \App\Services\CustomService::class );
之后,您可以使用辅助方法 app()
实例化 CustomLike
和 CustomService
类。
$model = app(\Turahe\Likeable\Contracts\Like::class); $service = app(\Turahe\Likeable\Contracts\LikeableService::class);
变更日志
请参阅 CHANGELOG 了解最近的变化信息。
贡献
请参阅 CONTRIBUTING 了解详细说明。
测试
您可以使用以下命令运行测试
$ vendor/bin/phpunit