itbm/laravel-likeable

让 Laravel Eloquent 模型在几分钟内实现点赞和点踩功能!

3.4.0 2023-03-04 17:08 UTC

This package is auto-updated.

Last update: 2024-09-04 20:49:55 UTC


README

cog-laravel-likeable

Releases License

注意

此包已被弃用且不再维护。开发已转移到 Laravel Love 包

如果您已经安装了 Laravel Likeable 版本,可以使用 Laravel Love 迁移指南

简介

Laravel Likeable 简化了 Eloquent 模型点赞和点踩的管理。只需几分钟即可让任何模型变得可点赞和可点踩!

内容

特性

  • 专为与 Laravel Eloquent 模型协同工作而设计。
  • 使用合约以保持高度可定制能力。
  • 使用特质以获得开箱即用的功能。
  • 大部分逻辑由 LikeableService 处理。
  • 包含 Artisan 命令 likeable:recount {model?} {type?} 用于重新获取点赞计数。
  • 点赞模型可以有点赞和点踩。
  • 一个模型的点赞和点踩是互斥的。
  • 获取按点赞数排序的点赞模型。
  • likeunlikedislikeundislike 方法提供事件。
  • 遵循 PHP 标准建议
  • 覆盖单元测试。

安装

首先,通过 Composer 拉取此包。

$ composer require itbm/laravel-likeable

如果您使用的是 Laravel 5.5,则可以跳过注册包的部分。

在 Laravel 5.4 及以下版本中注册包

app/config/app.php 中包含服务提供者。

'providers' => [
    Cog\Likeable\Providers\LikeableServiceProvider::class,
],

执行数据库迁移

最后,您需要发布并运行数据库迁移。

$ php artisan vendor:publish --provider="Cog\Likeable\Providers\LikeableServiceProvider" --tag=migrations
$ php artisan migrate

用法

准备点赞模型

在模型中使用 Likeable 合约以获取点赞行为,或者直接使用 Likeable 特质。

use Cog\Likeable\Contracts\Likeable as LikeableContract;
use Cog\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 作为排序方向。

事件

在添加点赞时触发 \Cog\Likeable\Events\ModelWasLiked 事件。

每次取消点赞时,都会触发 \Cog\Likeable\Events\ModelWasUnliked 事件。

每次添加踩时,都会触发 \Cog\Likeable\Events\ModelWasDisliked 事件。

每次取消踩时,都会触发 \Cog\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(
    \Cog\Likeable\Contracts\Like::class,
    \App\Models\CustomLike::class
);
使用服务类自己的实现
$this->app->singleton(
    \Cog\Likeable\Contracts\LikeableService::class,
    \App\Services\CustomService::class
);

之后,您可以使用辅助方法 app() 实例化 CustomLikeCustomService 类。

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

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

测试

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

$ vendor/bin/phpunit

安全

如果您发现任何与安全相关的问题,请通过电子邮件 open@cybercog.su 而不是使用问题跟踪器。

贡献者

Laravel Likeable 贡献者列表

替代方案

请随意添加更多替代方案作为拉取请求。

许可证

关于 CyberCog

CyberCog 是一个由爱好者组成的社交联盟。研究产品与软件开发中的最佳解决方案是我们的热情所在。

CyberCog