Laravel Likeable simplify management of Eloquent model's likes & dislikes. Make any model likeable
& dislikeable
in a minutes!
- Features
- Installation
- Usage
- Extending
- Change log
- Contributing
- Testing
- Security
- Credits
- Alternatives
- License
- About CyberCog
- 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. - Following PHP Standard Recommendations:
- Covered with unit tests.
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
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;
}
$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);
$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);
$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 \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.
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(
\Cog\Likeable\Contracts\Like::class,
\App\Models\CustomLike::class
);
$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);
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
If you discover any security related issues, please email oss@cybercog.su instead of using the issue tracker.
@mention | |
---|---|
@a-komarev |
Laravel Likeable contributors list
Feel free to add more alternatives as Pull Request.
Laravel Likeable
package is open-sourced software licensed under the MIT license.
CyberCog is a Social Unity of enthusiasts. Research best solutions in product & software development is our passion.