پیاده سازی سیستم فالو (Follow) و آنفالو (Unfollow) در لاراول ، در این پست از تجاری اپ قصد داریم پیاده سازی سیستم فالو کردن و آنفالو کردن در لاراول را در قالب یک مثال به شما آموزش دهیم (مانند فیس بوک و توییتر).اساسا یک کاربر می تواند کاربر دیگری را فالو یا آنفالو کند و شما می توانید کاربرانی که شما را دنبال می کنند وهمچنین تعداد کسانی را که دنبال می کنید یا شما را دنبال می کنند را ببینید.
در این آموزش ما نحوه ی ساخت سیستم فالو و آنفالو کردن در لاراول 5.8 را بصورت گام به گام توضیح خواهیم داد.ما در این آموزش برای پیاده سازی سیستم فالو و آنفالو از پکیج “overture/laravel-follow” استفاده می کنیم.همچنین برای این آموزش ما با استفاده از auth لاراول ، جدول کاربران و احراز هویت کاربر را ایجاد می کنیم.سپس یک کاربر می تواند وارد سیستم شود و تعداد کسانی که او را دنبال می کنند یا او آنها را دنبال می کند را مشاهده کند.
برای یادگیری این آموزش کافیست مراحل زیر را دنبال کنید:
برای هر پروژه لاراول ما نیاز داریم که لاراول را نصب کنیم. به همین دلیل ما یک مقاله در رابطه با چگونگی نصب و پیکربندی اولیه لاراول آماده کرده ایم که می توانید از اینجا ان را مشاهده نمایید : آموزش نصب لاراول به همراه تنظیمات اولیه
بعد از نصب و پیکربندی لاراول ما برای سیستم فالو و آنفالو باید پکیج laravel-follow را نصب کنیم.بنابراین ترمینال خود را باز کنید و دستور زیر را اجرا کنید:
composer require overtrue/laravel-follow
اکنون فایل config/app.php را باز کنید و service provider را به آن اضافه کنید:
config/app.php
'providers' => [
....
Overtrue\LaravelFollow\FollowServiceProvider::class,
],
انتشار فایل migrations
php artisan vendor:publish --provider='Overtrue\LaravelFollow\FollowServiceProvider' --tag="migrations"
به صورت اختیاری اگر می خواهید تنظیمات پیش فرض را تغییر دهید، می توانید فایل پیکربندی را منتشر کنید:
php artisan vendor:publish --provider="Overtrue\LaravelFollow\FollowServiceProvider" --tag="config"
بعد از انتشار فایل migrations برای ایجاد جداول دستور زیر را اجرا کنید:
php artisan migrate
همچنین بخوانید: نحوه ایجاد و دانلود PDF در لاراول 5.8
در این مرحله ما نیاز داریم احرازهویت (Authentication) را ایجاد کنیم ، برای این کار لاراول یک دستور artisan برای ما فراهم کرده است به این ترتیب ما برای ورود و ثبت نام نیازی به ایجاد route و کنترلر نداریم.دستور زیر را اجرا کنید:
php artisan make:auth
در این مرحله تعدادی کاربر ساختگی برای تست ایجاد می کنیم ، برای این کار از factory استفاده می کنیم. دستور زیر را اجرا کنید:
php artisan tinker
factory(App\User::class, 100)->create();
در اینجا ما باید مدل User را ویرایش کنیم.ما باید فاساد CanFollow و CanBeFollowed را در این مدل use کنیم.مانند کد زیر:
App/User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
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',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
در این مرحله Route هایی برای سیستم فالو و آنفالو ابجاد می کنیم.پس فایل web.php را باز کنید و Route های زیر را به ان اضافه کنید:
routes/web.php
<?php
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');
در این مرحله ما سه متد users() و user() و ajaxRequest() را به کنترلر HomeController اضافه می کنیم.بنابراین کنترلر HomeController را مانند زیر ویرایش کنید:
app/Http/HomeController.php
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('home');
}
/**
* Show the application of tejariapp.com.
*
* @return \Illuminate\Http\Response
*/
public function users()
{
$users = User::get()->sortByDesc('id');
return view('users', compact('users'));
}
/**
* Show the application of tejariapp.com.
*
* @return \Illuminate\Http\Response
*/
public function user($id)
{
$user = User::find($id);
return view('usersView', compact('user'));
}
/**
* Show the application of tejariapp.com.
*
* @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]);
}
}
در این مرحله ما باید فایل های با نام های userList.blade.php ، users.blade.php و usersView.blade.php در مسیر resources/views ایجاد کنیم و یک فایل با نام custom.js در مسیر publis/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">لیست کاربران - وب سایت تجاری اپ</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>وب سایت:</strong> tejariapp.com,
<strong>ایمیل: </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
resources/views/userList.blade.php
@if($users->count())
@foreach($users as $user)
<div class="col-2 profile-box border p-1 rounded text-center bg-light mr-4 mt-3">
<img src="https://dummyimage.com/165x166/333333/ffffff&text=tejariapp.com" class="w-100 mb-1">
<h5 class="m-0"><a href="{{ route('user.view', $user->id) }}"><strong>{{ $user->name }}</strong></a></h5>
<p class="mb-2">
<small>Following: <span class="badge badge-primary">{{ $user->followings()->get()->count() }}</span></small>
<small>Followers: <span class="badge badge-primary tl-follower">{{ $user->followers()->get()->count() }}</span></small>
</p>
<button class="btn btn-info btn-sm action-follow" data-id="{{ $user->id }}"><strong>
@if(auth()->user()->isFollowing($user))
UnFollow
@else
Follow
@endif
</strong></button>
</div>
@endforeach
@endif
publis/js/custom.js
همچنین بخوانید: عملیات CRUD با استفاده از Datatable و Ajax در لاراول 5.8
$(document).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$('.action-follow').click(function(){
var user_id = $(this).data('id');
var cObj = $(this);
var c = $(this).parent("div").find(".tl-follower").text();
$.ajax({
type:'POST',
url:'/ajaxRequest',
data:{user_id:user_id},
success:function(data){
console.log(data.success);
if(jQuery.isEmptyObject(data.success.attached)){
cObj.find("strong").text("Follow");
cObj.parent("div").find(".tl-follower").text(parseInt(c)-1);
}else{
cObj.find("strong").text("UnFollow");
cObj.parent("div").find(".tl-follower").text(parseInt(c)+1);
}
}
});
});
});
شما می توانید برنامه خود را با دستور زیر اجرا کنید و تست کنید
در زیر تصاویر خروجی برنامه را مشاهده می کنید:
امیدوارم این اموزش برای شما مفید بوده باشد.