Laravel Likeable simplify management of Eloquent model's likes & dislikes. Make any model likeable
& dislikeable
in a minute!
- Features
- Installation
- Usage
- Extending
- Change log
- Contributing
- Testing
- Security
- Contributors
- Alternatives
- License
- About CyberTurahe
- Designed to work with Laravel Eloquent models.
- Using contracts to keep high customization capabilities.
- Using traits to get functionality out of the box.
- Most part of the logic is handled by the
LikeableService
. - Has Artisan command
likeable:recount {model?} {type?}
to re-fetch likes counters. - Likeable model can has Likes and Dislikes.
- Likes and Dislikes for one model are mutually exclusive.
- Get Likeable models ordered by likes count.
- Events for
like
,unlike
,dislike
,undislike
methods. - Following PHP Standard Recommendations:
- Covered with unit tests.
First, pull in the package through Composer.
$ composer require turahe/laravel-likeable
If you are using Laravel 5.5 you can skip register package part.
Include the service provider within app/config/app.php
.
'providers' => [
Turahe\Likeable\LikeableServiceProvider::class,
],
At last, you need to publish and run database migrations.
$ php artisan vendor:publish --provider="Turahe\Likeable\Providers\LikeableServiceProvider" --tag=migrations
$ php artisan migrate
Use Likeable
contract in model which will get likes behavior and implement it or just use Likeable
trait.
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();
$article->likes;
$article->liked; // current user
$article->liked(); // current user
$article->liked($user->id);
Checks in eager loaded relations likes
& likesAndDislikes
first.
$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();
$article->dislikes;
$article->disliked; // current user
$article->disliked(); // current user
$article->disliked($user->id);
Checks in eager loaded relations dislikes
& likesAndDislikes
first.
$article->collectDislikers();
$article->removeDislikes();
$article->likesDiffDislikesCount;
$article->likesAndDislikes();
$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();
Uses desc
as default order direction.
$sortedArticles = Article::orderByDislikesCount()->get();
$sortedArticles = Article::orderByDislikesCount('asc')->get();
Uses desc
as default order direction.
On each like added \Turahe\Likeable\Events\ModelWasLiked
event is fired.
On each like removed \Turahe\Likeable\Events\ModelWasUnliked
event is fired.
On each dislike added \Turahe\Likeable\Events\ModelWasDisliked
event is fired.
On each dislike removed \Turahe\Likeable\Events\ModelWasUndisliked
event is fired.
$ 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"
You can override core classes of package with your own implementations:
Models\Like
Models\LikeCounter
Services\LikeableService
Note: Don't forget that all custom models must implement original models interfaces.
To make it you should use container binding interfaces to implementations in your application service providers.
$this->app->bind(
\Turahe\Likeable\Contracts\Like::class,
\App\Models\CustomLike::class
);
$this->app->singleton(
\Turahe\Likeable\Contracts\LikeableService::class,
\App\Services\CustomService::class
);
After that your CustomLike
and CustomService
classes will be instantiable with helper method app()
.
$model = app(\Turahe\Likeable\Contracts\Like::class);
$service = app(\Turahe\Likeable\Contracts\LikeableService::class);
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
You can run the tests with:
$ vendor/bin/phpunit