❤️ This package helps you to add user based follow system to your model.
Clone or download
overtrue Merge pull request #86 from liuhao25/master
事件目标对象获取问题修复
Latest commit 3c7c651 Jan 18, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
config use system defined user model Nov 26, 2018
database/migrations refactoring publish migration and config. Jun 29, 2018
src 事件目标对象获取问题修复 Jan 17, 2019
tests Fixed #70 #76 Dec 2, 2018
.gitignore Add ignore. Jun 21, 2018
.php_cs 📦 Refactory. May 1, 2017
.travis.yml PHP 7+ Aug 31, 2018
LICENSE Add license. Nov 12, 2016
README.md Fix #66 Sep 4, 2018
composer.json PHP 7+ Aug 31, 2018
phpunit.xml 📦 Refactory. May 1, 2017

README.md

Laravel 5 Follow System

❤️ This package helps you to add user based follow system to your model.

Build Status Latest Stable Version Latest Unstable Version Build Status Scrutinizer Code Quality Code Coverage Total Downloads License

Features

  • Support actions:
    • Follow
    • Like
    • Bookmark
    • Subscribe
    • Favorite
    • Vote (Upvote & Downvote)

Installation

Required

  • PHP 7.0 +
  • Laravel 5.5 +

You can install the package using composer

$ composer require overtrue/laravel-follow -vvv

Then add the service provider to config/app.php

Overtrue\LaravelFollow\FollowServiceProvider::class

Publish the migrations file:

$ php artisan vendor:publish --provider='Overtrue\LaravelFollow\FollowServiceProvider' --tag="migrations"

As optional if you want to modify the default configuration, you can publish the configuration file:

$ php artisan vendor:publish --provider='Overtrue\LaravelFollow\FollowServiceProvider' --tag="config"

And create tables:

$ php artisan migrate

Finally, add feature trait into User model:

use Overtrue\LaravelFollow\Traits\CanFollow;
use Overtrue\LaravelFollow\Traits\CanBeFollowed;

class User extends Model
{
    use CanFollow, CanBeFollowed;
}

Usage

Add CanXXX Traits to User model.

use Overtrue\LaravelFollow\Traits\CanFollow;
use Overtrue\LaravelFollow\Traits\CanLike;
use Overtrue\LaravelFollow\Traits\CanFavorite;
use Overtrue\LaravelFollow\Traits\CanSubscribe;
use Overtrue\LaravelFollow\Traits\CanVote;
use Overtrue\LaravelFollow\Traits\CanBookmark;

class User extends Model
{
    use CanFollow, CanBookmark, CanLike, CanFavorite, CanSubscribe, CanVote;
}

Add CanBeXXX Trait to target model, such as 'Post' or 'Music' ...:

use Overtrue\LaravelFollow\Traits\CanBeLiked;
use Overtrue\LaravelFollow\Traits\CanBeFavorited;
use Overtrue\LaravelFollow\Traits\CanBeVoted;
use Overtrue\LaravelFollow\Traits\CanBeBookmarked;

class Post extends Model
{
    use CanBeLiked, CanBeFavorited, CanBeVoted, CanBeBookmarked;
}

All available APIs are listed below.

Follow

\Overtrue\LaravelFollow\Traits\CanFollow

$user->follow($targets)
$user->unfollow($targets)
$user->toggleFollow($targets)
$user->followings()->get() // App\User:class
$user->followings(App\Post::class)->get()
$user->areFollowingEachOther($anotherUser);
$user->isFollowing($target)

\Overtrue\LaravelFollow\Traits\CanBeFollowed

$object->followers()->get()
$object->isFollowedBy($user)

Bookmark

\Overtrue\LaravelFollow\Traits\CanBookmark

$user->bookmark($targets)
$user->unbookmark($targets)
$user->toggleBookmark($targets)
$user->hasBookmarked($target)
$user->bookmarks()->get() // App\User:class
$user->bookmarks(App\Post::class)->get()

\Overtrue\LaravelFollow\Traits\CanBeBookmarked

$object->bookmarkers()->get() // or $object->bookmarkers 
$object->isBookmarkedBy($user)

Like

\Overtrue\LaravelFollow\Traits\CanLike

$user->like($targets)
$user->unlike($targets)
$user->toggleLike($targets)
$user->hasLiked($target)
$user->likes()->get() // default object: App\User:class
$user->likes(App\Post::class)->get()

\Overtrue\LaravelFollow\Traits\CanBeLiked

$object->likers()->get() // or $object->likers
$object->fans()->get() // or $object->fans
$object->isLikedBy($user)

Favorite

\Overtrue\LaravelFollow\Traits\CanFavorite

$user->favorite($targets)
$user->unfavorite($targets)
$user->toggleFavorite($targets)
$user->hasFavorited($target)
$user->favorites()->get() // App\User:class
$user->favorites(App\Post::class)->get()

\Overtrue\LaravelFollow\Traits\CanBeFavorited

$object->favoriters()->get() // or $object->favoriters 
$object->isFavoritedBy($user)

Subscribe

\Overtrue\LaravelFollow\Traits\CanSubscribe

$user->subscribe($targets)
$user->unsubscribe($targets)
$user->toggleSubscribe($targets)
$user->hasSubscribed($target)
$user->subscriptions()->get() // default object: App\User:class
$user->subscriptions(App\Post::class)->get()

Overtrue\LaravelFollow\Traits\CanBeSubscribed

$object->subscribers() // or $object->subscribers 
$object->isSubscribedBy($user)

Vote

\Overtrue\LaravelFollow\Traits\CanVote

$user->vote($target) // Vote with 'upvote' for default
$user->upvote($target)
$user->downvote($target)
$user->cancelVote($target)
$user->hasUpvoted($target)
$user->hasDownvoted($target)
$user->votes(App\Post::class)->get()
$user->upvotes(App\Post::class)->get()
$user->downvotes(App\Post::class)->get()

\Overtrue\LaravelFollow\Traits\CanBeVoted

$object->voters()->get()
$object->upvoters()->get()
$object->downvoters()->get()
$object->isVotedBy($user)
$object->isUpvotedBy($user)
$object->isDownvotedBy($user)

Parameters

All of the above mentioned methods of creating relationships, such as 'follow', 'like', 'unfollow', 'unlike', their syntax is as follows:

follow(array|int|\Illuminate\Database\Eloquent\Model $targets, $class = __CLASS__)

So you can call them like this:

// Id / Id array
$user->follow(1); // targets: 1, $class = App\User
$user->follow(1, App\Post::class); // targets: 1, $class = App\Post
$user->follow([1, 2, 3]); // targets: [1, 2, 3], $class = App\User

// Model
$post = App\Post::find(7);
$user->follow($post); // targets: $post->id, $class = App\Post

// Model array
$posts = App\Post::popular()->get();
$user->follow($posts); // targets: [1, 2, ...], $class = App\Post

Query relations

$followers = $user->followers
$followers = $user->followers()->where('id', '>', 10)->get()
$followers = $user->followers()->orderByDesc('id')->get()

The other is the same usage.

Working with model.

use Overtrue\LaravelFollow\FollowRelation;

// get most popular object

// all types
$relations = FollowRelation::popular()->get();

// followable_type = App\Post
$relations = FollowRelation::popular(App\Post::class)->get(); 

// followable_type = App\User
$relations = FollowRelation::popular('user')->get();
 
// followable_type = App\Post
$relations = FollowRelation::popular('post')->get();

// Pagination
$relations = FollowRelation::popular(App\Post::class)->paginate(15); 

Events

  • Overtrue\LaravelFollow\RelationAttaching
  • Overtrue\LaravelFollow\RelationAttached
  • Overtrue\LaravelFollow\RelationDetaching
  • Overtrue\LaravelFollow\RelationDetached
  • Overtrue\LaravelFollow\RelationToggling
  • Overtrue\LaravelFollow\RelationToggled
Event::listen(\Overtrue\LaravelFollow\RelationAttached::class, function($event) {
    // $event->causer; 
    // $event->getTargetsCollection(); 
    // $event->getRelationType();
});

About toggled event.

There has a extra properties for Overtrue\LaravelFollow\RelationToggled event.

$event->results; // ['attached' => [1, 2, 3], 'detached' => [5, 6]]
$event->attached; // [1, 2, 3]
$event->detached; // [5, 6]

License

MIT