Implementasi Membuat Visitor Counter atau Post View Counter di Laravel 9
Tags: tutorials
Published: 2022-11-19 17:10:17

---
title: Implementasi Membuat Visitor Counter atau Post View Counter di Laravel 9
published: true
date: 2022-04-09 14:36:06 UTC
tags: Tutorials
canonical_url: 
---

 **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
```

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
```

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();
    });
}
```

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),
    ];
}
```

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();
```

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
```

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,
        ]);
    }
}
```

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');
});
```

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>
```

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(),
```

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](https://storyset.com/people "People illustrations by Storyset")