turahe/laravel-likeable

Laravel Eloquent 模型的特质,用于轻松实现“点赞”、“收藏”或“记住”功能。

v1.0.0 2024-08-01 13:52 UTC

This package is auto-updated.

Last update: 2024-09-01 13:57:16 UTC


README

Latest Stable Version Total Downloads License Build Status Scrutinizer Code Quality FOSSA Status StyleCI PHP Composer

Laravel Likeable 简化了 Eloquent 模型的点赞和踩评管理。只需一分钟,即可使任何模型支持点赞和踩评!

内容

功能

  • 专为与 Laravel Eloquent 模型配合使用而设计。
  • 使用合约以保持高度的定制能力。
  • 使用特质以获得开箱即用的功能。
  • 大部分逻辑由 LikeableService 处理。
  • 包含 Artisan 命令 likeable:recount {model?} {type?} 以重新获取点赞计数。
  • 可点赞模型可以拥有点赞和踩评。
  • 一个模型的点赞和踩评是互斥的。
  • 按点赞数获取可点赞模型的排序。
  • likeunlikedislikeundislike 方法提供事件。
  • 遵循 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);

首先检查预加载关系 likeslikesAndDislikes

获取点赞了模型的用户集合
$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);

首先检查预加载关系 dislikeslikesAndDislikes

获取踩评了模型的用户集合
$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() 实例化 CustomLikeCustomService 类。

$model = app(\Turahe\Likeable\Contracts\Like::class);
$service = app(\Turahe\Likeable\Contracts\LikeableService::class);

变更日志

请参阅 CHANGELOG 了解最近的变化信息。

贡献

请参阅 CONTRIBUTING 了解详细说明。

测试

您可以使用以下命令运行测试

$ vendor/bin/phpunit