Hello everyone! In this article we will show how to make a simple follower system in Laravel 5.6 using MySQL Twitter style (User Following system) 🙂
The idea is that at the end of the system users can have followers showing the total number of followers and followed using a package that will help us saving us a lot of work 😀 , we will go step by step from a new Laravel 5.6 project
Create a new Laravel project leaving the folder name followsystem
composer create-project –prefer-dist laravel/laravel followsystem "5.6.*"
Configure our .env file with the data corresponding to our database to use
Install the laravel-follow package
composer require overtrue/laravel-follow
We open the config/app.php file and add the service provider
'providers' => [ Overtrue\LaravelFollow\FollowServiceProvider::class, ],
We will continue copying the migrations that the laravel-follow package brings using the following command
php artisan vendor:publish –provider='Overtrue\LaravelFollow\FollowServiceProvider' –tag="migrations"
We copy the package configuration file
php artisan vendor:publish --provider='Overtrue\LaravelFollow\FollowServiceProvider' --tag="config"
We run the migrations to create the necessary tables in our database
php artisan migrate
We will use the Laravel 5.6 Authentication system which provides us with a command to create everything we need!
php artisan make:auth
To start with concrete data and test the system we will create a base number of users using a factory, to keep it simple we will use tinker from the console
php artisan tinker
Once we enter tinker we are going to execute a factory command passing it the User model that Laravel brings by default and we indicate that we want to generate 100 new users
factory(App\User::class, 100)->create();
In order to use the laravel-follow package we must modify our User model that comes in App/User.php by default, leaving it as follows:
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Overtrue\LaravelFollow\Traits\CanFollow; use Overtrue\LaravelFollow\Traits\CanBeFollowed; class User extends Authenticatable { use Notifiable, CanFollow, CanBeFollowed; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; }
We will add the routes to our routes/web.php file corresponding to our authentication system and to implement the user following system.
Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::get('users', 'HomeController@users')->name('users'); Route::get('user/{id}', 'HomeController@user')->name('user.view'); Route::post('ajaxRequest', 'HomeController@ajaxRequest')->name('ajaxRequest');
As we see above, we add routes which point to methods that we must create within our HomeController (which is the controller that Laravel brings by default)
app/Http/HomeController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } /** * @return \Illuminate\Http\Response */ public function index() { return view('home'); } /** * @return \Illuminate\Http\Response */ public function users() { $users = User::get(); return view('users', compact('users')); } /** * @return \Illuminate\Http\Response */ public function user($id) { $user = User::find($id); return view('usersView', compact('user')); } /** * @return \Illuminate\Http\Response */ public function ajaxRequest(Request $request){ $user = User::find($request->user_id); $response = auth()->user()->toggleFollow($user); return response()->json(['success'=>$response]); } }
Finally we need to create the views, that is, our blade files and our js file where we use ajax
The files we need to create are userList.blade.php, users.blade.php y usersView.blade.php finally our js custom.js
resources/views/users.blade.php
@extends('layouts.app') @section('content') <script src="{{ asset('js/custom.js') }}" defer></script> <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <div class="card"> <div class="card-header">List of Users</div> <div class="card-body"> <div class="row pl-5"> @include('userList', ['users' => $users]) </div> </div> </div> </div> </div> </div> @endsection
resources/views/usersView.blade.php
@extends('layouts.app') @section('content') <script src="{{ asset('js/custom.js') }}" defer></script> <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <div class="card"> <div class="card-header"> {{ $user->name }} <br/> <small> <strong>Website:</strong> Blenderdeluxe.com, <strong>Email: </strong>{{ $user->email }} </small> </div> <div class="card-body"> <nav> <div class="nav nav-tabs" id="nav-tab" role="tablist"> <a class="nav-item nav-link active" id="nav-home-tab" data-toggle="tab" href="#followers" role="tab" aria-controls="nav-home" aria-selected="true">Followers <span class="badge badge-primary">{{ $user->followers()->get()->count() }}</span> </a> <a class="nav-item nav-link" id="nav-profile-tab" data-toggle="tab" href="#following" role="tab" aria-controls="nav-profile" aria-selected="false">Following <span class="badge badge-primary">{{ $user->followings()->get()->count() }}</span> </a> </div> </nav> <div class="tab-content" id="nav-tabContent"> <div class="tab-pane fade show active" id="followers" role="tabpanel" aria-labelledby="nav-home-tab"> <div class="row pl-5"> @include('userList', ['users'=>$user->followers()->get()]) </div> </div> <div class="tab-pane fade" id="following" role="tabpanel" aria-labelledby="nav-profile-tab"> <div class="row pl-5"> @include('userList', ['users'=>$user->followings()->get()]) </div> </div> </div> </div> </div> </div> </div> </div> @endsection
With this we will have a functional system where we can log in and follow other users of the system by clicking on the Follow button. I hope that the article will be useful to more than one person! Regards!
Page loaded in 37.88 ms