Ilmu Coding Ilmucoding.com - Merupakan situs yang membantu Anda belajar coding lebih mudah, nyaman, interaktif dan profesional. Belajar sekarang di ilmu coding. GRATIS

Tutorial Lengkap Membuat Middleware Sendiri di Laravel 8

7 min read

Tutorial Lengkap Membuat Simple Middleware Laravel 8

Jika seorang pengguna Laravel 8 ingin membatasi hak akses halaman / modul tertentu, pasti membutuhkan middleware.

… karena dengan middleware kita bisa membatasi izin terhadap user untuk mengakses halaman tertentu yang memiliki syarat.

Misalnya harus login terlebih dahulu.

Harus upgrade ke akun PRO.

Perlu aktivasi akun.

… dan masih banyak lagi.

Sama halnya kalau kita mau masuk ke rumah orang lain, pasti perlu izin terlebih dahulu kan?

Pasti jawabannya iya.

Jadi… kita tidak bisa mengakses halaman tertentu sebelum diizinkan oleh middleware.

Gambarannya seperti ini:

konsep middleware di bahasa pemrograman, tak terkecuali laravel 8

Melalui gambar di atas, kita bisa membayangkan bahwa user akan melewati middleware terlebih dahulu sebelum mengakses controller.

Masih bingung?

Coba baca dulu apa manfaat middleware.

Apa Manfaat Middleware?

Dengan menggunakan middleware di Laravel 8, maka kita akan mendapatkan manfaat sebagai berikut:

  1. Sebagai penengah antara request yang masuk dengan controller yang dituju.
  2. Dapat mencegat request yang masuk untuk diproses terlebih dahulu sebelum masuk ke controller.
  3. Reusable, dapat digunakan berkali-kali tanpa harus membuat ulang.
  4. Keamanan menjadi lebih baik.

Keren.

Berarti sudah saatnya kita mulai ngoding.

Step By Step Membuat Middleware di Laravel 8

Kita sudah mengenal middleware dengan penjelasan di atas.

Kalau belum paham, sebaiknya jangan dulu dilanjutkan.

… khawatir akan bingung.

Kalau memang sudah mengerti, kita mulai dari membuat project baru.

Step 1 – Membuat Project Baru Laravel 8

Gunakan composer untuk melakukan installasi Laravel 8. Silahkan ketik command di bawah ini untuk menginstall Laravel 8.

composer create-project --prefer-dist laravel/laravel laravel8_middleware

Baca Juga: Fitur dan Ulasan Terbaru Laravel 8 yang Perlu Kamu Tahu

Untuk membuka projectnya, kita bisa menggunakan Visual Studio Code, Sublime Text, Atom dan lain-lain.

Kebetulan saya menggunakan Visual Studio Code.

Jadi… Silahkan open project yang sudah berhasil kita install melalui composer di VS Code.

Hasilnya seperti ini:

struktur project middleware laravel 8

Step 2 – Konfigurasi Database dan Environment

Pertama-tama kita buat dulu dabatasenya.

Beri nama db_laravel_8_middleware.

membuat databse middleware laravel 8

Kemudian kita buka file laravel8_middleware/.env dan cari kode berikut:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Ubah menjadi:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_laravel_8_middleware
DB_USERNAME=root
DB_PASSWORD=

Penjelasan:

Setting konfigurasi di atas menyesuaikan dengan standart mysql pada umumnya.

Jika kamu menggunakan Nginx, MAMP, Linux dll, silahkan sesuaikan konfigurasi port, username dan passwornya.

Mari kita lanjut …

Step 3 – Melakukan Migrate Table User

Saat melakukan installasi, Laravel 8 sudah menyediakan migration table users berserta model User.

Untuk keperluan middleware sederhana, kita perlu menambahkan field role yang isinya untuk membedakan level user.

Field ini sangat dibutuhkan pada saat membuat middleware nanti.

Caranya, silahkan buka file laravel8_middeware/database/migrations/2014_10_12_000000_create_users_table.php.

Kemudian, tambahkan kode seperti baris ke 18 di bawah ini:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->string('role');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Seperti yang sudah dijelaskan, field ini sangat dibutuhkan pada saat membuat middleware nanti.

Jangan lupa simpan kembali filenya.

Jika sudah … Sekarang kita migrate.

Ketik kode berikut ini:

php artisan migrate

Setelah ini apa yang harus kita lakukan?

Baca Juga: Tutorial CRUD Laravel 8 untuk Pemula

Step 4 – Membuat Data User Seeder

Seed adalah salah satu fitur yang disediakan oleh Laravel. Fungsinya untuk mengisi data pada table sesuai dengan nama table, nama field dan value dari setiap field yang kita tentukan.

… dengan Seed, kita ngak perlu repot-repot melakukan insert langsung pada database. Cukup gunakan script dan simsalabim …. langsung ke insert.

Seed juga memudahkan kita sharing data kepada tim.

Gimana cara membuatnya? Cukup ketik command di bawah ini pada terminal:

php artisan make:seed UserSeeder

Jika berhasil, silahkan buka file UserSeeder.php yang ada di dalam direktori database/seeders.

Modifikasi file tersebut menjadi seperti ini:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Hash;
use DB;

class UserSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'Admin',
            'email' => 'admin@gmail.com',
            'password' => Hash::make('admin123'),
            'role' => 'admin',
            'created_at' => \Carbon\Carbon::now(),
            'email_verified_at' => \Carbon\Carbon::now()
        ]);
        DB::table('users')->insert([
            'name' => 'User',
            'email' => 'user@gmail.com',
            'password' => Hash::make('user123'),
            'role' => 'user',
            'created_at' => \Carbon\Carbon::now(),
            'email_verified_at' => \Carbon\Carbon::now()
        ]);
    }
}

Pada baris ke 17 dan 25, saya membuat 2 buah role, yaitu admin dan user.

… tujuannya untuk membedakan antara admin dan user.

Selain itu, ini akan berpengaruh mana route yang dapat diakses oleh admin dan mana yang dapat diakses oleh user.

Sekarang, buka file DatabaseSeeder.php yang ada di dalam direktori database/seeders.

Tambahkan kode pada baris ke di bawah ini:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UserSeeder::class);
    }
}

Fungsinya untuk memanggil class UserSeeder pada saat seed dijalankan.

Untuk menjalankannya, ketik command di bawah ini pada terminal:

php artisan db:seed

Oke sampai di sini sudah selesai seed-nya.

Sekarang, mari kita buat untuk proses Authenticationnya.

Step 5 – Membuat Laravel 8 Authentication Versi Bootstrap

Di sini saya menggunakan bootstrap pada proses authenticationnya.

… karena saya yakin, sudah banyak yang mengenal library ini.

So, Laravel 8 memisahkan diri dengan proses Auth.

Sekarang kita mesti install secara mandiri.

Kerennya, kita bisa memilih mau menggunakan Bootstrap, Vue, React dan lainnya.

… kebetulan, kita gunakan bootstrap aja.

Yuk mulai …

Ketik command di bawah ini:

composer require laravel/ui

Kemudian kita install Auth versi bootstrap, caranya dengan command di bawah ini:

php artisan ui bootstrap --auth

Selanjutnya, kita akan diminta untuk ketik command npm install && npm run dev.

Untuk melakukannya, pastikan perangkat yang gunakan sudah terinstall Node Js ya.

Jika sudah, langsung saja ketik command di bawah ini:

npm install && npm run dev

Sekarang persiapan authentication sudah lengkap.

Sebab sudah terdapat controller untuk Login, Register nya.

Kita tinggalkan dulu modifikasi pada bagian ini.

Sejenak kita lompat ke pembuatan middlewarenya.

Step 6 – Membuat Middleware Laravel 8 untuk Admin dan User

Oke, saatnya kita membuat middleware untuk admin di Laravel 8 terlebih dahulu.

Langkah 1 – Membuat Middleware Admin

Caranya ketik command di bawah ini:

php artisan make:middleware AdminMiddleware

Sekarang buka file AdminMiddleware.php pada direktori App/Http/Middleware.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Auth;

class AdminMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user()->role != "admin"){
            /* 
            silahkan modifikasi pada bagian ini
            apa yang ingin kamu lakukan jika rolenya tidak sesuai
            */
            return redirect()->to('logout');
        }
        return $next($request);
    }
}

Pada baris ke 7, saya memanggil Auth.

Sedangkan pada baris ke 13-15 kita menulis kode yang berfungsi untuk mengecek apabila bukan role admin, maka akan langsung logout secara otomatis.

… di sini, kita bisa memodifikasi apa yang akan terjadi apabila bukan role admin.

Misalnya redirect ke suatu route, mendapatkan session flash dan lain sebagainya.

Sekarang kita buat middleware untuk bagian user.

Langkah 2 – Membuat Middleware User

Ketik command di bawah ini:

php artisan make:middleware UserMiddleware

… kemudian ubah kodenya menjadi:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Auth;

class UserMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user()->role != "user"){
            /* 
            silahkan modifikasi pada bagian ini
            apa yang ingin kamu lakukan jika rolenya tidak sesuai
            */
            return redirect()->to('logout');
        }
        return $next($request);
    }
}

Penjelasannya sama persis dengan admin di atas.

Langkah 3 – Mendaftarkan Middleware yang Sudah Dibuat di Laravel 8

Buka file Kernel.php pada direktori App/Http.

Tambahkan baris ke 11-12 seperti di bawah ini:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    'admin' => \App\Http\Middleware\AdminMiddleware::class,
    'user' => \App\Http\Middleware\UserMiddleware::class,
];

Lalu simpan.

Apa tujuannya?

Karena kita mendaftarkannya di $routeMiddleware, jadi nama admin dan user dapat kita gunakan pada saat melakukan group nama route yang mana dapat diakses admin dan mana yang dapat diakses user.

Step 7 – Membuat Controller untuk Dashboard Admin dan User

Kita sudah punya controller untuk bagian Auth.

Sekarang saatnya kita membuat halaman khusus yang hanya dapat diakses oleh role yang bersangkutan.

Silahkan buat controller untuk Admin terlebih dahulu.

php artisan make:controller AdminController

dan …

php artisan make:controller UserController

… lalu buat masing-masing function index pada controller di atas.

Berikut kode untuk controller AdminController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class AdminController extends Controller
{
    public function index()
    {
        $user = Auth::user();
        return view('admin.home', compact('user'));
    }
}

… dan ini untuk UserController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class UserController extends Controller
{
    public function index()
    {
        $user = Auth::user();
        return view('user.home', compact('user'));
    }
}

Persiapan controller selesai.

Mari kita lanjut…

Step 8 – Membuat Halaman View untuk Masing-masing Role

Buat 2 buah folder bernama admin dan user di direktori resources/views.

Pada masing-masing folder buat file bernama home.blade.php

Sekarang kita ketik kode kedua home.blade.php di atas menjadi seperti di bawah ini:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard {{ $user->name }}</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    <p><strong>Selamat datang {{ $user->name }}!</strong> Anda telah melakukan login sebagai {{ $user->role }}</p>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Mantap.

Step 9 – Mengatur Middleware Admin dan User pada Route

Silahkan buka routes/web.php.

Kita modifikasi menjadi:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController;
use App\Http\Controllers\UserController;

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::middleware(['auth'])->group(function () {

    Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

    Route::middleware(['admin'])->group(function () {
        Route::get('admin', [AdminController::class, 'index']);
    });

    Route::middleware(['user'])->group(function () {
        Route::get('user', [UserController::class, 'index']);
    });

    Route::get('/logout', function() {
        Auth::logout();
        redirect('/');
    });

});

Penjelasan:

Route admin hanya dapat diakses apabila ia lolos dari Middleware Admin. Begitupun dengan route user tidak akan bisa diakses kecuali kalau dia lolos dari Middleware User.

Route logout sebenernya sudah tersedia di Route::routes(), hanya saja ia hanya bisa diakses dengan method POST.

… sedangkan pada middleware, kita memanggilnya dengan method GET.

Jadi, nggak masalah kita buat route logout khusus dengan method GET.

Step 10 – Modifikasi HomeController

Jika kita menggunakan Laravel Mix untuk Scaffold / Auth, by default setiap kali berhasil login atau register akan diarahkan ke route home.

Sebenarnya kita bisa melakukan custom pada bagian itu.

… hanya saja tutorial ini akan semakin panjaaaanggggggg.

Maka izinkan saya mempersingkatnya dengan sedikit memodifikasi pada file HomeController.php di direktori App/Http/Controllers.

Ubah kodenya menjadi seperti di bawah ini:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        $role = Auth::user()->role;
        if($role == "admin"){
            return redirect()->to('admin');
        } else if($role == "user"){
            return redirect()->to('user');
        } else {
            return redirect()->to('logout');
        }
    }
}

Simple sih.

Kalau ia login akan kita redirect ke halaman yang sesuai dengan rolenya.

Melakukan Testing Middleware Laravel 8

Silahkan jalankan project dengan mengetik command di bawah ini:

php artisan migrate

Halaman URL untuk login:

http://127.0.0.1:8000/login

Halaman URL untuk register:

http://127.0.0.1:8000/login

Halaman dashboard admin:

http://127.0.0.1:8000/admin

Halaman dashboard user:

http://127.0.0.1:8000/user

Penutup

Alhamdulillah kita telah menyelesaikan tutorial lengkap membuat middleware sendiri menggunakan Laravel 8.

Semoga tutorial ini dapat membantu teman-teman membuat project menggunakan Laravel 8.

Baca Juga: Tutorial Membuat Fitur Auth Sederhana di Laravel 8

Harapannya, project yang dikerjakan akan lebih keren lagi ke depannya.

Aamiin.

Oh iya, jika membutuhkan source code project ini, silahkan download melalui link github di bawah ini:

Download Source Code

Semoga bermanfaat…

Ilmu Coding Ilmucoding.com - Merupakan situs yang membantu Anda belajar coding lebih mudah, nyaman, interaktif dan profesional. Belajar sekarang di ilmu coding. GRATIS

Leave a Reply

Your email address will not be published. Required fields are marked *

Jika terbantu dengan artikel ini, silahkan share, beri komentar dan "klik" 1 kali pada iklan ya.