DEV Community

Hilmi Hidayat
Hilmi Hidayat

Posted on • Originally published at divisidev.com on

Implementasi Membuat Visitor Counter atau Post View Counter di Laravel 9

Visitor Counter - Saat membuat suatu sistem seperti portal berita, terkadang kita perlu mengetahui berapa banyak kunjungan dari suatu postingan di portal tersebut. Untuk membuat fungsi seperti itu, kita dapat menggunakan fungsi increment yang berfungsi untuk menambahkan value setiap fungsi tersebut dipanggil.

Pada artikel ini, saya akan membagikan cara membuat visitor atau view counter menggunakan fungsi increment di Laravel 9 🚀

Step 1: Install Laravel

//via Laravel Installer
composer global require laravel/installer
laravel new laravel-visitor-counter

//via Composer
composer create-project laravel/laravel laravel-visitor-counter
Enter fullscreen mode Exit fullscreen mode

Kita mulai dari awal yaitu dengan menginstall fresh laravel project. Pada step ini tentunya temen-temen sudah paham bagaimana cara menginstall Laravel. Yap, ada beberapa cara untuk menginstall laravel diantaranya adalah menggunakan laravel installer atau menggunakan composer seperti contoh di atas.

Step 2: Membuat Model, Migration & Factory

php artisan make:model Article -mf
Enter fullscreen mode Exit fullscreen mode

Setelah itu, kita lanjut membuat model, migration dan faker untuk Article. Silakan jalankan perintah seperti di atas untuk generate model, migration & faker Article sekaligus.

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->string('slug');
        $table->longText('body');
        $table->integer('views')->default(0);
        $table->timestamps();
    });
}
Enter fullscreen mode Exit fullscreen mode

Selanjutnya, kita set migrationnya. Nah, disini saya menambahkan field views dengan default value 0. Maksudnya, ketika halaman article tersebut diakses akan menambah value pada field ini.

public function definition()
{
    $title = $this->faker->sentence(3);
    $slug = \Str::slug($title);
    return [
        'title' => $title,
        'slug' => $slug,
        'body' => $this->faker->paragraph,
        'views' => random_int(0, 300),
    ];
}
Enter fullscreen mode Exit fullscreen mode

Oke, kita lanjut untuk generate data dummy menggunakan faker. Silakan buka file Article di dalam folder database/factories, lalu sesuaikan seperti contoh di atas.

php artisan tinker
Article::factory()->count(20)->create();
Enter fullscreen mode Exit fullscreen mode

Nah, selanjutnya kita bisa menjalankan factory yang telah kita define sebelumnya menggunakan tinker dengan perintah seperti di atas.

Step 3: Setup Controller

php artisan make:controller ArticleController
Enter fullscreen mode Exit fullscreen mode

Oke, kita lanjut lagi ke Controller. Silakan jalankan perintah seperti di atas untuk generate ArticleController.

<?php

namespace App\Http\Controllers;

use App\Models\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function index()
    {
        return view('welcome',[
            'articles' => Article::all(), // Article::all() is the same as Article::get()
            // 'articles' => Article::orderByDesc('views')->get(), // display articles in descending order of views
        ]);
    }

    public function show($slug)
    {
        $article = Article::where('slug', $slug)->first(); // show the article by slug
        $article->increment('views'); // increment views by 1

        return response()->json([
            'article' => $article,
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

Buka file ArticleController yang telah digenerate sebelumnya, lalu tambahkan function index dan show dengan kode-kode seperti di atas.

Perhatikan pada function show. Pada function tersebut terdapat fungsi increment('views'), yang artinya jika function show tersebut dipanggil maka akan menambahkan value 1 pada field views. Jika kita ingin menambahkan value 5 setiap function tersebut dipanggil, kita dapat menggunakan seperti $article->increment('views', 5);

Step 4: Setup Route

use App\Http\Controllers\ArticleController;
use Illuminate\Support\Facades\Route;

Route::controller(ArticleController::class)->group(function () {
    Route::get('/', 'index')->name('articles.index');
    Route::get('/{slug}', 'show')->name('articles.show');
});
Enter fullscreen mode Exit fullscreen mode

Berikutnya, setup atau tambahkan route web seperti di atas.

Step 5: Setup View

<!doctype html>
<html lang="en">
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- Bootstrap CSS -->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
        <title>Laravel Visitor Counter</title>
    </head>
    <body>
        <div class="container py-5">
            <div class="row justify-content-center">
                @foreach ($articles as $key => $item)
                    <div class="col-md-4">
                        <a href="{{ route('articles.show',$item->slug) }}" class="text-decoration-none">
                            <div class="card text-dark mb-4">
                                <div class="card-header">
                                    <h1 class="fs-5 fw-bold">{{ $item->title }}</h1>
                                </div>
                                <div class="card-body">
                                    <p class="card-text ">{{ Str::limit($item->body, 100, '...') }}</p>
                                </div>
                                <div class="card-footer">
                                    <small class="text-muted">{{ $item->views }} views</small>
                                </div>
                            </div>
                        </a>
                    </div>
                @endforeach
            </div>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
    </body>
</html>
Enter fullscreen mode Exit fullscreen mode

Selanjutnya buka file welcome.blade.php, kemudian ubah kodenya seperti contoh di atas. Disini, kita hanya mengubahkan tampilan default dari laravel menjadi tampilan dari data-data article kita yang sebelumnya sudah kita generate menggunakan faker.

Step 6: Testing

Sampai pada step terakhir. Silakan jalankan laravel project temen-temen dengan menjalankan perintah php artisan serve, lalu buka pada browser kalian. Silakan klik link atau klik pada salah satu card atau article yang ada. Setelah itu, coba cek pada articles table, seharusnya value views pada data article yang kamu show tersebut akan bertambah atau berubah menjadi 1.

'articles' => Article::orderByDesc('views')->get(),
Enter fullscreen mode Exit fullscreen mode

Untuk mengurutkan data articles berdasarkan total viewsnya, kamu bisa mengubah pada function index di ArticleController menjadi seperti di atas.

Oke, cukup sampai disini artikel kali ini. Pada artikel ini, kita belajar sedikit tentang bagaimana cara membuat fitur sederhana penghitung tampilan/kunjungan atau views/visitor counter dengan menggunakan fungsi increment di laravel 9. Semoga artikel ini dapat membantu, dan untuk temen-temen jika ada kritik, saran, masukan atau apapun itu yang ingin didiskusikan, silakan tulis komentar kalian pada form komentar di bawah ini. See u 👋

Credit: People illustrations by Storyset

Top comments (0)