devdojo / laravel-reactions
Requires
- php: ^8.1|^8.2
- illuminate/database: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.35
- mockery/mockery: ^1.6
- orchestra/testbench: ^8.0
- phpunit/phpunit: ^9.5.0
README
Laravel Reactions 是一个包,如果你想在 Eloquent 模型上实现类似 Facebook 的点赞功能,你需要这个包。
特性
- 安装简单,无需配置;
- 提供现成的特性;
- 可以通过多态的多对多关系为多个实体实现点赞;
- 可以通过一些底层的魔法为多个实体实现点赞;
免责声明
本项目与 Facebook 没有任何关联。 我只是用“点赞”这个概念来提供一种思路。如果遇到法律问题,请通过电子邮件告知。
安装
使用 Composer 安装此包。
$ composer require DevDojo/laravel-reactions
将服务提供者添加到你的 config/app.php
文件中。
DevDojo\LaravelReactions\Providers\ReactionsServiceProvider::class,
运行迁移以创建 reactions
和 reactables
表。
$ php artisan migrate
你已经可以开始了。
使用方法
将特性添加到模型中
要使用此包,你需要遵循以下两个步骤
- 将
DevDojo\LaravelReactions\Traits\Reacts
特性添加到将要对此做出反应的实体中; - 将
DevDojo\LaravelReactions\Traits\Reactable
特性添加到将要“接收”点赞的实体中; - 确保接收点赞的实体也实现了
DevDojo\LaravelReactions\Contracts\ReactableInterface
接口;
让我们举一个例子。
假设你的应用程序中有一些用户。你正在构建一个博客,所以你会有一些帖子。
你希望让你的用户可以对你的帖子进行点赞。就像 Facebook 一样,你知道。
假设我们有两个模型:User
和 Post
。
按照步骤,我们首先将 DevDojo\LaravelReactions\Traits\Reacts
特性添加到我们的 User
模型中。
use DevDojo\LaravelReactions\Traits\Reacts; class User extends Model { use Reacts; }
完成!现在,让我们来修改 Post
模型!
use DevDojo\LaravelReactions\Traits\Reactable; use DevDojo\LaravelReactions\Contracts\ReactableInterface; class Post extends Model implements ReactableInterface { use Reactable; }
太棒了!你完成了。
默认情况下,该包附带一个 Reaction
模型。这个模型只有一个简单的属性:其 name
。你可以轻松创建一个新的,只需要
$likeReaction = Reaction::createFromName('like'); $likeReaction->save(); $loveReaction = Reaction::createFromName('love'); $loveReaction->save();
React!
我们的模型准备好了。我们可以使用它们。如何使用?
// picking the first user, for this example... $user = User::first(); // the previously created reaction $likeReaction = Reaction::where('name', '=', 'like')->first(); // picking up a post... $awesomePost = Post::first(); // react to it! $user->reactTo($awesomePost, $likeReaction);
很简单,reactTo
方法会为你处理一切。
获取模型的点赞
就像你可以让一个实体对另一个实体进行点赞一样,你应该能够获取一个实体的所有点赞。
让我们看看如何做到这一点。
// picking up a post... $awesomePost = Post::first(); // get all reactions $reactions = $awesomePost->reactions;
在 $reactions
中,你将有一个 Reaction
模型的集合,可以立即使用。
获取点赞摘要
你可能不需要每次都获取特定实体点赞的所有信息。因此,我为你实现了 getReactionsSummary
。
// picking up a post... $awesomePost = Post::first(); // get a summary of related reactions $reactionsSummary = $awesomePost->getReactionsSummary();
在 $reactionsSummary
中,你将找到一个由两个属性组成的项的集合:name
和 count
。想象一下,我们在控制器中做以下操作
$reactionsSummary = $awesomePost->getReactionsSummary(); return $reactionsSummary;
这就是我们将得到的结果
[ { "name": "like", "count": 12 }, { "name": "love", "count": 7 } ]
访问“响应者”
在 Facebook 上,你可以看到谁对某个帖子做出了某种反应。要获取这个“谁”,你可以使用 getResponder
方法。当然,这适用于使用 reactions
关系方法获取的每个反应。
假设有一个名为“Francesco”的用户已经对某个帖子使用了“喜欢”的反应。
// our awesome post. $awesomePost = Post::first(); // every $reaction is a Reaction model foreach($awesomePost->reactions as $reaction) { $user = $reaction->getResponder(); // this will output "Francesco" echo $user->name; }
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
测试
$ vendor/bin/phpunit
贡献
安全性
如果您发现任何与安全相关的问题,请通过电子邮件hellofrancesco@gmail.com联系,而不是使用问题跟踪器。
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。