Personal Notes Parmi

konsep MVC versus Framework


You said: Bisa jelaskan konsep framework versus MVC dalam dunia koding, khususnya dalam hal terkait PHP dan bahasa pendukung atau semacamnya ?

Tentu. Banyak pemula PHP sering mencampuradukkan Framework dengan MVC, padahal keduanya berbeda namun saling berkaitan.

1. Apa itu MVC?

MVC (Model-View-Controller) adalah pola arsitektur (design pattern) untuk mengorganisasi kode aplikasi.

Tujuannya adalah memisahkan logika aplikasi menjadi beberapa bagian agar lebih mudah dikelola.

Struktur MVC

User
 |
 v
Controller
 |      \
 v       \
Model    View
 |
Database

Komponen MVC

1. Model

Bertanggung jawab terhadap data dan database.

Contoh:

class UserModel {
    public function getUser($id) {
        // Query database
    }
}

Tugas Model:

  • CRUD database
  • Query data
  • Validasi data tertentu
  • Business logic terkait data

2. View

Bertugas menampilkan informasi ke pengguna.

Contoh:

<h1><?= $user['nama']; ?></h1>

Biasanya berisi:

  • HTML
  • CSS
  • JavaScript ringan
  • Template

3. Controller

Menjadi penghubung antara Model dan View.

Contoh:

class UserController {

    public function profile($id) {

        $userModel = new UserModel();
        $user = $userModel->getUser($id);

        include "views/profile.php";
    }
}

Tugas Controller:

  • Menerima request
  • Memanggil Model
  • Mengirim data ke View
  • Mengatur alur aplikasi

Analogi Restoran

Bayangkan sebuah restoran:

Komponen Analogi
User Pelanggan
Controller Pelayan
Model Koki
Database Gudang bahan
View Makanan yang disajikan

Pelanggan tidak langsung ke dapur. Ia berbicara ke pelayan (Controller), pelayan meminta koki (Model), lalu hasilnya disajikan (View).


2. Apa itu Framework?

Framework adalah kumpulan library, aturan, dan struktur yang membantu membangun aplikasi lebih cepat.

Framework biasanya sudah menyediakan:

  • Routing
  • MVC
  • Koneksi database
  • Authentication
  • Session
  • Security
  • Template Engine
  • ORM

Framework ibarat "kerangka rumah" yang sudah jadi.


3. Hubungan Framework dan MVC

MVC hanyalah konsep arsitektur.

Framework adalah implementasi nyata yang sering menggunakan MVC.

Contoh:

MVC = Blueprint rumah

Framework = Rumah setengah jadi yang tinggal dilengkapi

Jadi:

MVC ≠ Framework

tetapi

Banyak Framework menggunakan MVC

4. Framework PHP yang Menggunakan MVC

Laravel

Struktur:

app/
 ├─ Models/
 ├─ Http/
 │   └─ Controllers/
resources/
 └─ views/

Contoh Route:

Route::get('/user/{id}', [UserController::class, 'show']);

Controller:

public function show($id)
{
    $user = User::find($id);

    return view('user', compact('user'));
}

Laravel adalah framework paling populer saat ini untuk PHP.


CodeIgniter

Struktur:

app/
 ├─ Controllers/
 ├─ Models/
 └─ Views/

Lebih ringan dan sederhana dibanding Laravel.


Yii

Juga menggunakan MVC dan banyak dipakai untuk aplikasi enterprise.


CakePHP

Salah satu framework PHP senior yang menganut MVC dengan ketat.


5. Apakah Semua Framework Harus MVC?

Tidak.

Ada framework yang tidak murni MVC.

Contoh di luar PHP:

Node.js

Express.js

app.get('/user', (req, res) => {
    res.send('Hello');
});

Express tidak memaksa MVC.

Anda boleh:

  • MVC
  • Clean Architecture
  • Hexagonal Architecture
  • Monolith sederhana

Python

Flask

Tidak memaksa MVC.


Golang

Framework seperti Gin juga tidak mengharuskan MVC.


6. Bahasa Pendukung di Dunia PHP

Saat membuat aplikasi PHP modern, biasanya tidak hanya PHP saja.

Frontend

HTML

Struktur halaman.

<h1>Dashboard</h1>

dan file View.

Back-end Developer

Fokus ke:

Controller
Model
Database

Karena tugasnya terpisah, konflik pekerjaan menjadi lebih sedikit.


4. Mempermudah Pengembangan Fitur Baru

Misalnya ingin menambah fitur:

Manajemen Produk

Cukup membuat:

ProductModel
ProductController
product_view

Struktur yang sama dapat digunakan berulang kali.

Developer tidak perlu berpikir ulang bagaimana menyusun kode.


5. Kode Lebih Mudah Digunakan Kembali (Reusability)

Contoh:

UserModel

dapat dipakai oleh:

DashboardController
AdminController
ProfileController

Semua controller dapat menggunakan model yang sama.

Tidak perlu menulis query yang sama berkali-kali.


6. Testing Lebih Mudah

Karena logika bisnis berada di Model atau Service, Anda bisa menguji fungsi tertentu tanpa membuka browser.

Contoh:

$total = $orderModel->hitungTotal();

Dapat diuji secara otomatis menggunakan unit test.

Pada aplikasi besar, ini sangat menghemat waktu.


7. Skalabilitas Lebih Baik

Untuk aplikasi kecil:

1.000 baris kode

mungkin belum terasa manfaat MVC.

Tetapi pada aplikasi:

50.000+
100.000+
500.000+ baris kode

MVC menjadi sangat penting.

Tanpa struktur yang jelas, proyek akan sulit dikembangkan.


8. Cocok dengan Framework Modern

Hampir semua framework PHP populer menggunakan atau terinspirasi MVC:

  • Laravel
  • CodeIgniter
  • Yii
  • CakePHP

Karena itu memahami MVC membuat Anda lebih cepat belajar framework-framework tersebut.


9. Mempermudah Pengembangan API

Misalnya suatu saat aplikasi web ingin ditambah:

  • Mobile Android
  • Mobile iOS
  • React Frontend
  • Vue Frontend

Model yang sama masih bisa dipakai.

Yang berubah hanya cara penyajian datanya.

Contoh:

Model
 └─ User Data

Controller Web
 └─ HTML

Controller API
 └─ JSON

10. Membuat Kode Lebih Profesional

MVC sudah menjadi standar industri selama bertahun-tahun.

Ketika programmer lain melihat struktur:

Models/
Controllers/
Views/

mereka langsung memahami alur aplikasi.

Proses onboarding programmer baru menjadi jauh lebih cepat.


Kapan MVC Terasa Manfaatnya?

Tidak terlalu terasa

  • Website sederhana
  • Landing page
  • Script utilitas kecil
  • Proyek belajar

Sangat terasa

  • Sistem inventori
  • ERP
  • CRM
  • E-commerce
  • Sistem sekolah
  • Aplikasi perusahaan
  • Backend API besar

Kesimpulan

MVC memberikan keuntungan utama berupa:

  1. Kode lebih rapi dan terstruktur.
  2. Mudah dipelihara dan diperbarui.
  3. Memudahkan kerja tim.
  4. Mempercepat pengembangan fitur baru.
  5. Mengurangi duplikasi kode.
  6. Lebih mudah diuji (testing).
  7. Mampu menangani proyek besar.
  8. Menjadi fondasi hampir semua framework PHP modern seperti Laravel dan CodeIgniter.

Singkatnya, MVC bukan membuat program lebih cepat berjalan, tetapi membuat programmer lebih cepat dan lebih aman mengembangkan aplikasi dalam jangka panjang.

Bagaimana cara saya mengenali sebuah pola atau metode yang digunakan oleh sebuah skrip, semisal .PHP. Saya melihat pada beberapa skrip pendek maupun panjang tetapi saya belum menemukan cara jitu, memastikan sebuah skrip menggunakan metode semisal MVC/framework

Pertanyaan yang sangat bagus. Sebenarnya programmer berpengalaman pun sering perlu beberapa menit hingga beberapa jam untuk mengenali arsitektur sebuah proyek yang belum pernah mereka lihat.

Jawaban singkatnya:

Tidak ada cara 100% pasti hanya dengan melihat satu file .php. Yang perlu dilihat adalah struktur proyek dan pola interaksi antar file.

1. Jangan Fokus pada Isi File Dulu, Lihat Struktur Folder

Ketika menerima sebuah proyek PHP, hal pertama yang saya lakukan adalah melihat pohon direktori:

project/
├── app/
├── models/
├── views/
├── controllers/
├── routes/
├── vendor/
├── public/
└── index.php

Dari struktur saja kita sudah bisa menebak banyak hal.

Indikasi MVC

Jika ada folder:

models/
views/
controllers/

atau

app/
 ├── Models
 ├── Views
 └── Controllers

hampir pasti menggunakan MVC.


Indikasi Laravel

Misalnya:

app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
vendor/
artisan

Kalau ada file:

artisan
composer.json

hampir pasti Laravel.


Indikasi CodeIgniter

app/
public/
system/
writable/

atau versi lama:

application/
system/

2. Cari Titik Masuk (Entry Point)

Biasanya:

index.php

atau

public/index.php

Buka file tersebut.

PHP Native

Sering terlihat seperti:

$conn = mysqli_connect(...);

$result = mysqli_query(...);

echo "Hello";

langsung bekerja.


MVC / Framework

Biasanya sangat sedikit isinya:

require '../vendor/autoload.php';

$app = require_once '../bootstrap/app.php';

atau

require 'system/core/CodeIgniter.php';

Artinya sebagian besar pekerjaan dilakukan framework.


3. Cari Routing

MVC modern hampir selalu memiliki routing.

Contoh Laravel:

Route::get('/user', [UserController::class, 'index']);

Contoh sederhana:

$route = $_GET['page'];

switch($route)
{
    case 'home':
        ...
}

Jika request diarahkan ke Controller tertentu, itu indikasi MVC.


4. Lihat Aliran Data

MVC biasanya mempunyai pola:

Request
   ↓
Controller
   ↓
Model
   ↓
Database

Controller
   ↓
View
   ↓
Response

Contoh:

public function show($id)
{
    $user = $this->userModel->find($id);

    return view('profile', $user);
}

Dari satu fungsi ini saja kita bisa melihat:

  • Ada Model
  • Ada Controller
  • Ada View

→ MVC.


5. Kenali Ciri PHP Native

Kalau Anda menemukan banyak file seperti:

<html>

<?php

$conn = mysqli_connect(...);

$query = mysqli_query(...);

while(...)
{
    echo ...
}

?>

</html>

biasanya:

  • bukan MVC
  • bukan framework
  • procedural PHP

atau sering disebut:

PHP Native

6. Cari Composer

PHP modern hampir selalu memakai Composer.

Jika ada:

composer.json
vendor/

berarti besar kemungkinan:

  • Laravel
  • Symfony
  • CakePHP
  • Yii
  • Slim
  • atau framework modern lainnya

7. Perhatikan Cara Memanggil Database

Native

mysqli_query(...)

atau:

mysql_query(...)

(kode lama)


Framework

Laravel:

User::find(1);

atau:

User::where('email', $email)->first();

Ini ORM Eloquent.

Begitu melihat:

::where()
::find()
::save()

saya langsung curiga Laravel atau ORM lain.


8. Cari Kata Kunci Khas Framework

Laravel

Route::
Controller
Model
Request
Middleware
Eloquent
artisan

CodeIgniter

CI_Controller
CI_Model
base_url()
redirect()
$this->load->view()

Symfony

namespace App\Controller;

dan banyak anotasi:

#[Route('/')]

9. Perhatikan Namespace

PHP kuno biasanya:

class User
{
}

PHP modern:

namespace App\Controllers;

class UserController
{
}

Jika banyak namespace seperti itu:

App\Models
App\Controllers
App\Services

biasanya proyek cukup modern dan kemungkinan menggunakan framework atau setidaknya pola arsitektur tertentu.


10. Cari Nama Class

Ini trik yang sering saya gunakan.

Kalau menemukan banyak class bernama:

UserController
OrderController
HomeController

UserModel
OrderModel

UserService
OrderService

maka hampir pasti menggunakan pola arsitektur yang jelas.

Sebaliknya:

fungsi.php
proses.php
save.php
edit.php
hapus.php

biasanya proyek procedural.


Cara Cepat yang Saya Pakai Saat Audit Proyek

Saya biasanya memeriksa dalam urutan berikut:

Langkah 1

Lihat struktur folder.

controllers/
models/
views/

Ada?

→ kemungkinan MVC.


Langkah 2

Cari:

composer.json
vendor/

Ada?

→ framework atau library modern.


Langkah 3

Buka:

index.php

Lihat siapa yang pertama kali dipanggil.


Langkah 4

Cari:

Controller
Model
Route

Jika ada:

Route -> Controller -> Model -> View

maka hampir pasti MVC.


Analogi yang Mudah

Bayangkan Anda menemukan mobil di garasi dan ingin tahu mereknya.

Anda tidak perlu langsung membongkar mesin.

Lihat dulu:

  • logo depan
  • bentuk bodi
  • dashboard
  • posisi tombol

Begitu juga dengan kode.

Arsitektur lebih mudah dikenali dari "bentuk proyek" daripada isi satu file.

Karena itu ketika melihat proyek PHP baru, fokuslah terlebih dahulu pada:

  1. Struktur folder.
  2. File index.php.
  3. File composer.json.
  4. Folder routes.
  5. Folder Controllers, Models, dan Views.

Dari lima hal tersebut, biasanya saya sudah bisa menebak dengan akurasi 80–90% apakah proyek tersebut:

  • PHP procedural,
  • MVC buatan sendiri,
  • Laravel,
  • CodeIgniter,
  • Symfony,
  • atau framework lainnya.
Bagaimana mengenali routing di skrip?

Routing adalah salah satu ciri paling mudah untuk mengenali apakah sebuah aplikasi menggunakan MVC atau framework modern.

Secara sederhana:

Routing adalah mekanisme yang menentukan URL mana diproses oleh kode yang mana.

Misalnya user membuka:

https://domain.com/user/123

Routing akan menentukan bahwa URL tersebut harus ditangani oleh:

UserController->show(123)

1. Cara Mengenali Routing dari Alurnya

Tanpa routing:

domain.com/home.php
domain.com/login.php
domain.com/produk.php

Web server langsung membuka file yang diminta.

Struktur biasanya:

home.php
login.php
produk.php
edit_produk.php
hapus_produk.php

Ini umumnya PHP procedural.


Dengan routing:

domain.com/home
domain.com/login
domain.com/produk/15

URL tidak menunjukkan nama file sebenarnya.

Yang menangani URL adalah router.


2. Ciri Routing pada PHP Native

Contoh sederhana:

$page = $_GET['page'];

switch($page)
{
    case 'home':
        include 'home.php';
        break;

    case 'produk':
        include 'produk.php';
        break;
}

URL:

domain.com/index.php?page=produk

Ini sebenarnya sudah bentuk routing sederhana.

Yang menentukan file mana dijalankan adalah:

switch($page)

3. Ciri Routing MVC Buatan Sendiri

Contoh:

$url = $_SERVER['REQUEST_URI'];

if ($url == '/user')
{
    $controller = new UserController();
    $controller->index();
}

Begitu Anda melihat:

REQUEST_URI
PATH_INFO
explode('/')
switch($url)

biasanya sedang ada mekanisme routing.


4. Cara Cepat Menemukan Routing

Jika proyek besar, cari kata:

route
router
routing

Di Linux:

grep -Ri "route" .

Atau di VS Code:

Ctrl + Shift + F

cari:

Route
Router
REQUEST_URI

5. Routing pada Laravel

Sangat mudah dikenali.

Folder:

routes/

berisi:

web.php
api.php

Isi:

Route::get('/user', [UserController::class, 'index']);

Route::post('/login', [AuthController::class, 'login']);

Ketika melihat:

Route::

hampir pasti Laravel.


Contoh lain:

Route::get('/produk/{id}', [ProductController::class, 'show']);

Artinya:

/produk/5

akan memanggil:

ProductController->show(5)

6. Routing pada CodeIgniter

File:

app/Config/Routes.php

atau versi lama:

application/config/routes.php

Contoh:

$routes->get('/produk', 'Product::index');

atau:

$route['produk'] = 'product/index';

Kalau menemukan file bernama:

Routes.php

Anda sedang berada di pusat routing aplikasi.


7. Trik Melihat Routing dari URL

Misalnya URL:

domain.com/index.php

Kemungkinan besar:

PHP Native

Jika:

domain.com/user/edit/5

atau:

domain.com/produk/hapus/10

biasanya ada router yang bekerja.

Karena tidak ada file:

user/edit/5.php

yang bisa langsung dijalankan oleh PHP.


8. Periksa File index.php

Banyak framework hanya punya satu file yang benar-benar diakses browser:

public/index.php

Semua request masuk ke sana.

Misalnya:

require '../vendor/autoload.php';

$app = require_once '../bootstrap/app.php';

atau:

$app->run();

Ini menandakan pola:

Browser
  ↓
index.php
  ↓
Router
  ↓
Controller
  ↓
View

Disebut juga Front Controller Pattern.


9. Indikasi Sangat Kuat Ada Routing

Jika Anda menemukan kode seperti:

UserController
HomeController
ProductController

tetapi tidak ada satupun file yang memanggilnya secara langsung, berarti hampir pasti ada routing yang menghubungkan URL ke controller-controller tersebut.


10. Metode Detektif yang Saya Pakai

Ketika menerima proyek PHP yang belum dikenal:

Langkah 1

Cari:

routes
Routes.php
web.php
api.php
router.php

Langkah 2

Cari kata:

Route::

atau:

REQUEST_URI

Langkah 3

Buka:

public/index.php

atau:

index.php

Langkah 4

Ikuti alurnya:

index.php
  ↓
router
  ↓
controller
  ↓
model
  ↓
view

Jika menemukan alur tersebut, berarti Anda sudah menemukan sistem routingnya.


Singkatnya, routing biasanya dapat dikenali dari kode yang membaca URL (REQUEST_URI, parameter GET, Route::get(), Routes.php) lalu memutuskan controller atau file mana yang harus dijalankan. Begitu Anda menemukan tempat di mana URL dipetakan ke fungsi/class tertentu, itulah "jantung routing" dari aplikasi tersebut.

Apa perbedaan routing di Laravel dan CodeIgniter?

Kalau dilihat dari konsep dasarnya, Laravel dan CodeIgniter sama-sama menggunakan routing untuk memetakan URL ke Controller, tetapi pendekatan dan fiturnya berbeda.

Gambaran Sederhana

Anggap URL sebagai alamat rumah.

/produk/10

Routing bertugas mengatakan:

"Alamat ini harus dilayani oleh siapa?"

Misalnya:

ProductController -> show(10)

Baik Laravel maupun CodeIgniter melakukan hal yang sama, tetapi sintaks dan kemampuannya sedikit berbeda.


1. Sintaks Routing

Laravel

File:

routes/web.php

Contoh:

Route::get('/produk', [ProductController::class, 'index']);

Route::get('/produk/{id}', [ProductController::class, 'show']);

Terlihat cukup "modern" dan eksplisit.

URL:

/produk/5

otomatis memanggil:

ProductController->show(5);

CodeIgniter 4

File:

app/Config/Routes.php

Contoh:

$routes->get('produk', 'Product::index');

$routes->get('produk/(:num)', 'Product::show/$1');

URL:

/produk/5

akan memanggil:

Product::show(5)

2. Cara Menulis Parameter URL

Laravel

Laravel sangat intuitif:

Route::get('/user/{id}', function ($id) {
    return $id;
});

Anda langsung melihat bahwa:

{id}

adalah parameter.


CodeIgniter

Menggunakan placeholder:

$routes->get('user/(:num)', 'User::show/$1');

Keterangan:

(:num) = angka
(:any) = karakter bebas

dan:

$1

artinya parameter pertama.

Bagi pemula biasanya Laravel lebih mudah dibaca.


3. Route Grouping

Laravel

Sangat elegan:

Route::prefix('admin')->group(function () {

    Route::get('/users', [UserController::class, 'index']);

    Route::get('/produk', [ProductController::class, 'index']);

});

Hasil URL:

/admin/users
/admin/produk

CodeIgniter

Mirip:

$routes->group('admin', function($routes){

    $routes->get('users', 'User::index');

    $routes->get('produk', 'Product::index');

});

Fungsinya sama.


4. Resource Routing

Ini salah satu fitur yang banyak dipakai untuk REST API.

Laravel

Route::resource('products', ProductController::class);

Laravel otomatis membuat:

GET     /products
POST    /products
GET     /products/{id}
PUT     /products/{id}
DELETE  /products/{id}

tanpa perlu menulis satu per satu.


CodeIgniter

Juga mendukung:

$routes->resource('products');

Namun Laravel biasanya dianggap lebih matang dan lebih sering dipakai dalam pengembangan REST API.


5. Route Model Binding

Ini fitur favorit banyak programmer Laravel.

Laravel

Misalnya:

Route::get('/users/{user}', [UserController::class, 'show']);

Controller:

public function show(User $user)
{
    return $user;
}

Laravel otomatis:

User::find(id)

tanpa perlu Anda tulis.

Jadi:

/users/15

langsung menghasilkan objek User ID 15.


CodeIgniter

Tidak memiliki fasilitas otomatis sekuat ini.

Biasanya Anda masih mengambil data secara manual:

public function show($id)
{
    $user = $this->userModel->find($id);
}

6. Middleware pada Routing

Middleware adalah "penjaga gerbang".

Misalnya hanya user login yang boleh mengakses halaman tertentu.

Laravel

Route::get('/dashboard',
    [DashboardController::class, 'index']
)->middleware('auth');

Sangat terintegrasi.


CodeIgniter

Menggunakan Filter.

Contoh:

$routes->get(
    'dashboard',
    'Dashboard::index',
    ['filter' => 'auth']
);

Mirip konsepnya tetapi implementasi Laravel biasanya lebih fleksibel dan banyak digunakan.


7. Auto Routing

Inilah salah satu perbedaan filosofi terbesar.

CodeIgniter

Dulu sangat mengandalkan Auto Routing.

Misalnya ada Controller:

Product.php

dengan method:

public function detail()

Maka URL:

/product/detail

bisa langsung berjalan meskipun tidak didefinisikan di routing.


Laravel

Laravel hampir selalu mensyaratkan route didefinisikan secara eksplisit:

Route::get('/product/detail', ...);

Keuntungan:

  • Lebih aman
  • Lebih jelas
  • Lebih mudah diaudit

Karena semua URL terlihat dari file route.


8. Mana yang Lebih Mudah Dipahami?

Bagi pemula:

CodeIgniter

Sering terasa lebih sederhana.

$routes->get('produk', 'Product::index');

Konsepnya langsung.


Laravel

Sedikit lebih banyak fitur:

Route::get(
    '/produk',
    [ProductController::class, 'index']
);

tetapi lebih konsisten untuk proyek besar.


Analogi

Bayangkan routing seperti petugas resepsionis.

CodeIgniter

Petugas kadang bisa menebak tujuan Anda:

"Pak mau ke ProductController/detail ya?"

(auto routing)


Laravel

Petugas hanya mengikuti daftar resmi:

URL A -> Ruangan B
URL B -> Ruangan C

Tidak ada tebakan.

Lebih ketat tetapi lebih aman.


Kesimpulan

Perbedaan utama:

Aspek Laravel CodeIgniter
Sintaks route Lebih modern Lebih sederhana
Parameter URL {id} (:num)
Route Model Binding Ada, sangat kuat Tidak sekuat Laravel
Middleware Sangat terintegrasi Menggunakan Filter
Auto Routing Umumnya tidak Ya (terutama konsep lama CI)
Cocok untuk Proyek besar, API, enterprise Proyek kecil-menengah, cepat dibuat
Tingkat otomatisasi Tinggi Lebih manual

Secara praktis, kalau Anda membuka proyek dan melihat:

Route::get(...)
Route::post(...)
Route::resource(...)

hampir pasti itu Laravel.

Kalau melihat:

$routes->get(...)
$routes->post(...)
$routes->group(...)

hampir pasti itu CodeIgniter 4.

Apa kelebihan middleware di Laravel?

Middleware di Laravel sering dianggap salah satu fitur terbaiknya karena memungkinkan Anda menyisipkan logika pemeriksaan atau pemrosesan di antara request dan controller.

Secara sederhana:

Browser
   ↓
Middleware
   ↓
Controller
   ↓
Response

Middleware bertindak seperti satpam atau petugas pemeriksaan sebelum pengguna masuk ke bagian aplikasi tertentu.


Tanpa Middleware

Misalnya Anda punya 20 halaman yang hanya boleh diakses user login.

Tanpa middleware, setiap controller harus memeriksa login:

public function dashboard()
{
    if (!auth()->check()) {
        return redirect('/login');
    }

    // proses dashboard
}

Lalu kode yang sama muncul di:

UserController
ProductController
OrderController
ReportController

Akibatnya:

  • Banyak duplikasi kode
  • Sulit dipelihara
  • Mudah terjadi kesalahan

Dengan Middleware

Buat middleware sekali:

public function handle($request, Closure $next)
{
    if (!auth()->check()) {
        return redirect('/login');
    }

    return $next($request);
}

Gunakan pada route:

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

    Route::get('/dashboard', ...);

    Route::get('/products', ...);

    Route::get('/orders', ...);

});

Sekarang semua route tersebut otomatis terlindungi.


Kelebihan Middleware Laravel

1. Mengurangi Duplikasi Kode

Ini manfaat terbesar.

Daripada menulis:

if (!login)

di puluhan controller, cukup satu middleware.

Prinsip ini dikenal sebagai:

DRY
(Don't Repeat Yourself)

2. Memisahkan Tanggung Jawab

Controller fokus pada logika bisnis:

OrderController

bertugas mengelola pesanan.

Bukan bertugas memeriksa:

  • login
  • role user
  • IP address
  • token

Semua itu dipindahkan ke middleware.

Hasilnya kode lebih bersih.


3. Kontrol Hak Akses yang Sangat Mudah

Contoh:

Route::get('/admin')
    ->middleware('admin');

Middleware:

if (!$user->isAdmin()) {
    abort(403);
}

Sangat mudah membuat:

  • Super Admin
  • Admin
  • Manager
  • Staff
  • Customer

4. Cocok untuk Keamanan

Banyak fitur keamanan Laravel sebenarnya bekerja melalui middleware.

Contohnya:

Authentication

auth

Email Verification

verified

Rate Limiting

throttle

CSRF Protection

Laravel memeriksa token CSRF melalui lapisan middleware.


5. Mudah Digunakan Berkelompok

Misalnya seluruh area admin:

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

});

Artinya:

Harus Login
+
Harus Admin

Sebelum controller dijalankan.


6. Bisa Memodifikasi Request

Sebelum request masuk ke controller:

public function handle($request, Closure $next)
{
    $request->merge([
        'timezone' => 'Asia/Jakarta'
    ]);

    return $next($request);
}

Controller langsung menerima data yang sudah dimodifikasi.


7. Bisa Memodifikasi Response

Middleware tidak hanya bekerja sebelum controller.

Ia juga bisa bekerja setelah controller selesai.

Contoh:

$response = $next($request);

$response->headers->set(
    'X-App-Version',
    '1.0'
);

return $response;

Semua response mendapat header tambahan.


8. Sangat Berguna untuk Logging

Contoh:

public function handle($request, Closure $next)
{
    Log::info(
        'User akses: '.$request->path()
    );

    return $next($request);
}

Seluruh aktivitas pengguna dapat dicatat.


9. Berguna untuk API

Misalnya API harus menggunakan token.

Middleware:

if ($request->header('token') != $validToken)
{
    return response()->json([
        'error' => 'Unauthorized'
    ], 401);
}

Controller API tidak perlu lagi memeriksa token satu per satu.


10. Middleware Bisa Berantai

Laravel mendukung banyak middleware sekaligus:

Route::middleware([
    'auth',
    'verified',
    'admin',
    'throttle:60,1'
])->group(function () {

});

Alurnya:

Request
 ↓
Auth Middleware
 ↓
Verified Middleware
 ↓
Admin Middleware
 ↓
Throttle Middleware
 ↓
Controller

Ini membuat sistem sangat modular.


Analogi Sederhana

Bayangkan Anda masuk ke gedung perkantoran.

Sebelum mencapai ruangan tujuan, Anda melewati:

Gerbang
 ↓
Satpam
 ↓
Resepsionis
 ↓
Pemeriksaan Kartu Akses
 ↓
Lift
 ↓
Ruangan Tujuan

Masing-masing melakukan pemeriksaan tertentu.

Middleware bekerja persis seperti itu.

Controller baru dijalankan setelah semua pemeriksaan lolos.


Dibanding Menaruh Semua Logika di Controller

Tanpa middleware:

Controller
 ├─ Cek Login
 ├─ Cek Role
 ├─ Cek Email Verified
 ├─ Cek Token
 ├─ Logging
 └─ Logika Bisnis

Dengan middleware:

Middleware Login
 ↓
Middleware Role
 ↓
Middleware Verify
 ↓
Middleware Logging
 ↓
Controller
    └─ Hanya Logika Bisnis

Jauh lebih bersih dan mudah dirawat.

Kesimpulan

Kelebihan utama middleware Laravel adalah:

  • Mengurangi duplikasi kode.
  • Memisahkan logika keamanan dari logika bisnis.
  • Mudah mengatur autentikasi dan otorisasi.
  • Mempermudah logging dan audit.
  • Bisa memodifikasi request maupun response.
  • Sangat cocok untuk API dan aplikasi besar.
  • Dapat dirangkai (chain) menjadi beberapa lapisan pemeriksaan.

Karena alasan-alasan ini, middleware merupakan salah satu fitur yang membuat Laravel sangat nyaman digunakan untuk aplikasi menengah hingga besar dibanding pendekatan PHP procedural atau MVC sederhana.