Introduction
Laravel Likeable simplify management of Eloquent model's likes & dislikes. Make any model likeable
& dislikeable
in a minutes!
Contents
- Features
- Installation
- Usage
- Extending
- Change log
- Contributing
- Testing
- Security
- Credits
- Alternatives
- License
- About CyberCog
Features
- 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 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. - Covered with unit tests.
Installation
First, pull in the package through Composer.
composer require cybercog/laravel-likeable
And then include the service provider within app/config/app.php
.
'providers' => [
Cog\Likeable\Providers\LikeableServiceProvider::class,
],
At last you need to publish and run database migrations.
php artisan vendor:publish --provider="Cog\Likeable\Providers\LikeableServiceProvider" --tag=migrations
php artisan migrate
Usage
Prepare likeable model
Use HasLikes
contract in model which will get likes behavior and implement it or just use HasLikes
trait.
use Cog\Likeable\Contracts\HasLikes as HasLikesContract;
use Cog\Likeable\Traits\HasLikes;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements HasLikesContract {
use HasLikes;
}
Available methods
Likes
Like model
$article->like(); // current user
$article->like($user->id);
Remove like mark from model
$article->unlike(); // current user
$article->unlike($user->id);
Toggle like mark of model
$article->likeToggle(); // current user
$article->likeToggle($user->id);
Get model likes count
$article->likesCount;
Get model likes counter
$article->likesCounter;
Get likes relation
$article->likes();
Illuminate\Database\Eloquent\Collection
of existing model likes
Get iterable $article->likes;
Boolean check if user liked model
$article->liked; // current user
$article->liked(); // current user
$article->liked($user->id);
Delete all likes for model
$article->removeLikes();
Dislikes
Dislike model
$article->dislike(); // current user
$article->dislike($user->id);
Remove dislike mark from model
$article->undislike(); // current user
$article->undislike($user->id);
Toggle dislike mark of model
$article->dislikeToggle(); // current user
$article->dislikeToggle($user->id);
Get model dislikes count
$article->dislikesCount;
Get model dislikes counter
$article->dislikesCounter;
Get dislikes relation
$article->dislikes();
Illuminate\Database\Eloquent\Collection
of existing model dislikes
Get iterable $article->dislikes;
Boolean check if user disliked model
$article->disliked; // current user
$article->disliked(); // current user
$article->disliked($user->id);
Delete all dislikes for model
$article->removeDislikes();
Likes and Dislikes
Get difference between likes and dislikes
$article->likesDiffDislikesCount;
Get likes and dislikes relation
$article->likesAndDislikes();
Illuminate\Database\Eloquent\Collection
of existing model likes and dislikes
Get iterable $article->likesAndDislikes;
Scopes
Find all articles liked by user
Article::whereLikedBy($user->id)
->with('likesCounter') // Allow eager load (optional)
->get();
Find all articles disliked by user
Article::whereDislikedBy($user->id)
->with('dislikesCounter') // Allow eager load (optional)
->get();
Fetch Likeable models by likes count
$sortedArticles = Article::orderByLikesCount()->get();
$sortedArticles = Article::orderByLikesCount('asc')->get();
Uses desc
as default order direction.
Fetch Likeable models by dislikes count
$sortedArticles = Article::orderByDislikesCount()->get();
$sortedArticles = Article::orderByDislikesCount('asc')->get();
Uses desc
as default order direction.
Events
On each like added \Cog\Likeable\Events\ModelWasLiked
event is fired.
On each like removed \Cog\Likeable\Events\ModelWasUnliked
event is fired.
On each dislike added \Cog\Likeable\Events\ModelWasDisliked
event is fired.
On each dislike removed \Cog\Likeable\Events\ModelWasUndisliked
event is fired.
Console commands
Recount likes and dislikes of all model types
likeable:recount
Recount likes and dislikes of concrete model type (using morph map alias)
likeable:recount --model="article"
Recount likes and dislikes of concrete model type (using fully qualified class name)
likeable:recount --model="App\Models\Article"
Recount only likes of all model types
likeable:recount --type="like"
Recount only likes of concrete model type (using morph map alias)
likeable:recount --model="article" --type="like"
Recount only likes of concrete model type (using fully qualified class name)
likeable:recount --model="App\Models\Article" --type="like"
Recount only dislikes of all model types
likeable:recount --type="dislike"
Recount only dislikes of concrete model type (using morph map alias)
likeable:recount --model="article" --type="dislike"
Recount only dislikes of concrete model type (using fully qualified class name)
likeable:recount --model="App\Models\Article" --type="dislike"
Extending
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.
Use model class own implementation
$this->app->bind(
\Cog\Likeable\Contracts\Like::class,
\App\Models\CustomLike::class
);
Use service class own implementation
$this->app->singleton(
\Cog\Likeable\Contracts\LikeableService::class,
\App\Services\CustomService::class
);
After that your CustomLike
and CustomService
classes will be instantiable with helper method app()
.
$model = app(\Cog\Likeable\Contracts\Like::class);
$service = app(\Cog\Likeable\Contracts\LikeableService::class);
Change log
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Testing
You can run the tests with:
vendor/bin/phpunit
Security
If you discover any security related issues, please email oss@cybercog.su instead of using the issue tracker.
Credits
Alternatives
Feel free to add more alternatives as Pull Request.
License
-
Laravel Likeable
package is open-sourced software licensed under the MIT license.
About CyberCog
CyberCog is a Social Unity of enthusiasts. Research best solutions in product & software development is our passion.