Skip to content

03. Perbedaan PHP Native dan Laravel ​

Pada dua materi sebelumnya, kita telah mempelajari dasar kerja PHP Native serta gambaran umum framework Laravel secara terpisah. Sekarang, kita akan meninjau perbandingan langsung di antara kedua pendekatan tersebut melalui studi kasus pengembangan aplikasi perpustakaan.


A. Pengantar ​

Perbandingan antara PHP Native dan Laravel sering kali disalahpahami sebagai perdebatan tentang mana yang "lebih unggul". Faktanya, Laravel dibangun menggunakan bahasa pemrograman PHP itu sendiri.

Tujuan dari perbandingan ini bukan untuk menyimpulkan bahwa PHP Native itu buruk atau Laravel selalu menjadi pilihan terbaik di setiap situasi. Tujuannya adalah memahami perbedaan mendasar dalam pendekatan pengembangan (development approach): bagaimana kode dirancang, bagaimana keamanan ditangani, dan bagaimana kedua teknologi ini menyelesaikan kebutuhan teknis yang sama.


B. Perbedaan Pendekatan Pengembangan ​

Secara mendasar, perbedaan antara PHP Native dan Laravel terletak pada tingkat kebebasan (flexibility) dan standarisasi kerangka kerja (conventions):

1. PHP Native ​

  • Kendali Penuh: Pengembang menulis kode PHP secara langsung dan menentukan sendiri struktur direktori, arsitektur data, dan tata kelola alur aplikasi.
  • Implementasi Mandiri: Setiap kebutuhan seperti perutean (routing), validasi input, koneksi basis data, dan proteksi sesi ditulis secara manual atau menggabungkan pustaka pihak ketiga sendiri.
  • Fleksibilitas Tinggi: Sangat leluasa untuk membuat skrip khusus tanpa terikat pada aturan baku sebuah framework.

2. Laravel ​

  • Berbasis Konvensi: Pengembang mengikuti pola baku (convention over configuration) yang telah distandarisasi oleh framework.
  • Komponen Siap Pakai: Berbagai kebutuhan umum web seperti routing terpusat, pengontrol alur (Controller), lapisan middleware, query builder, Eloquent ORM, migrasi skema database, sistem validasi, dan template engine Blade telah terintegrasi secara bawaan.
  • Konsistensi dan Pemeliharaan: Memudahkan tim pengembang untuk bekerja bersama karena setiap bagian aplikasi memiliki tempat dan pola penulisan yang seragam.

C. Perbandingan Struktur Project ​

Mari kita lihat perbedaan organisasi berkas pada aplikasi sistem perpustakaan sederhana.

1. Contoh Struktur PHP Native ​

perpustakaan/
├── config/
│   └── database.php
├── includes/
│   ├── header.php
│   └── footer.php
├── assets/
│   ├── css/
│   └── js/
├── index.php
├── buku.php
├── tambah_buku.php
├── login.php
└── logout.php

Pada PHP Native, struktur di atas tidak memiliki aturan baku. Setiap pengembang atau tim dapat merancang struktur folder yang berbeda sesuai preferensi masing-masing.

2. Contoh Struktur Laravel 13 ​

perpustakaan/
├── app/
│   ├── Http/
│   │   └── Controllers/
│   │       ├── AuthController.php
│   │       └── BookController.php
│   └── Models/
│       ├── Book.php
│       └── User.php
├── bootstrap/
│   └── app.php
├── database/
│   └── migrations/
│       └── 2026_01_01_000001_create_books_table.php
├── public/
│   └── index.php
├── resources/
│   └── views/
│       ├── layouts/
│       │   └── app.blade.php
│       └── books/
│           └── index.blade.php
├── routes/
│   └── web.php
└── .env

Pada Laravel, struktur folder telah memiliki aturan standar industri. Pengembang lain yang bergabung ke dalam project dapat langsung mengetahui lokasi file Model, Controller, View, atau konfigurasi rute tanpa perlu membaca dokumentasi struktur dari awal.


D. Perbandingan Routing ​

Kebutuhan: Pengguna mengakses alamat /buku di browser untuk melihat katalog buku perpustakaan.

1. Implementasi PHP Native ​

Pada PHP Native, cara paling umum dan sederhana adalah membuat berkas fisik bernama buku.php atau membaca parameter URL menggunakan $_GET:

php
<?php
// File: index.php
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

switch ($requestUri) {
    case '/buku':
        // Memuat controller atau berkas logika buku
        require_once __DIR__ . '/buku.php';
        break;

    case '/login':
        require_once __DIR__ . '/login.php';
        break;

    default:
        http_response_code(404);
        echo 'Halaman tidak ditemukan';
        break;
}

Penjelasan Kode PHP Native: ​

  • $_SERVER['REQUEST_URI'] membaca alamat URL lengkap yang diminta browser.
  • Fungsi parse_url(..., PHP_URL_PATH) memisahkan path URL dari query string.
  • Pernyataan switch ... case memeriksa path yang cocok secara manual, lalu menyertakan (require) berkas yang bersangkutan.
  • Jika rute tidak ditemukan, pengembang harus secara manual menetapkan status kode HTTP 404 menggunakan http_response_code(404).

2. Implementasi Laravel ​

Pada Laravel, seluruh rute didefinisikan secara deklaratif di dalam berkas routes/web.php:

php
<?php
// File: routes/web.php
use App\Http\Controllers\BookController;
use Illuminate\Support\Facades\Route;

Route::get('/buku', [BookController::class, 'index']);

Penjelasan Kode Laravel: ​

  • Route::get() mendefinisikan bahwa rute merespons metode permintaan HTTP GET pada path /buku.
  • [BookController::class, 'index'] memetakan permintaan langsung ke method index() pada BookController.
  • Penanganan URL yang tidak terdaftar otomatis dikelola oleh framework dengan menampilkan halaman respons 404 standar.

Perbedaan Pendekatan: ​

PHP Native memungkinkan penanganan rute manual melalui pemetaan berkas fisik atau parser switch-case sederhana. Laravel menyediakan sistem perutean terpusat yang mendukung penamaan rute (named routes), pengelompokan rute (route groups), dan penyaringan middleware secara otomatis.


E. Perbandingan Koneksi dan Pengolahan Database ​

Kebutuhan: Mengambil seluruh data buku yang berstatus aktif dari tabel basis data MySQL.

1. Implementasi PHP Native (PDO) ​

php
<?php
// File: database.php
$host = 'localhost';
$db   = 'perpustakaan_db';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    die('Koneksi basis data gagal: ' . $e->getMessage());
}

// Menjalankan query dengan Prepared Statement
$status = 'tersedia';
$sql = "SELECT id, judul, penulis, tahun_terbit FROM books WHERE status = :status";
$stmt = $pdo->prepare($sql);
$stmt->execute(['status' => $status]);
$books = $stmt->fetchAll();

Penjelasan Kode PHP Native: ​

  • Menggunakan PDO (PHP Data Objects), antarmuka standar modern bawaan PHP untuk berinteraksi dengan berbagai basis data relasional.
  • Opsi PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION memastikan setiap kegagalan query melempar exception sehingga dapat ditangani dengan blok try-catch.
  • Menggunakan Prepared Statement ($pdo->prepare()) dan parameter binding (['status' => $status]) untuk mencegah celah keamanan SQL Injection.
  • Hasil data diambil dalam bentuk array asosiatif menggunakan fetchAll().

2. Implementasi Laravel (Eloquent ORM) ​

php
<?php
// Di dalam Controller atau Route
use App\Models\Book;

$books = Book::where('status', 'tersedia')->get();

Penjelasan Kode Laravel: ​

  • Book adalah Model Eloquent yang merepresentasikan tabel books di MySQL.
  • Method where('status', 'tersedia') menyusun kueri penyaringan data dengan parameter binding otomatis di balik layar.
  • Method get() mengeksekusi kueri dan mengembalikan hasilnya dalam bentuk objek Collection.

Perbedaan Pendekatan: ​

PHP Native dengan PDO mengharuskan penulisan string SQL mentah secara eksplisit dan penyiapan parameter binding manual. Eloquent ORM pada Laravel membungkus query builder dengan pendekatan Object-Oriented, menghasilkan kode yang lebih ringkas, mudah dibaca, serta otomatis menerapkan parameter binding yang aman.


F. Perbandingan Validasi Input ​

Kebutuhan: Memvalidasi data judul buku yang dikirim pengguna melalui formulir penambahan buku sebelum disimpan. Aturannya: judul buku wajib diisi, bertipe teks, dan maksimal 255 karakter.

1. Implementasi PHP Native ​

php
<?php
$errors = [];
$judul = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $judul = isset($_POST['judul']) ? trim($_POST['judul']) : '';

    if ($judul === '') {
        $errors['judul'] = 'Judul buku wajib diisi.';
    } elseif (mb_strlen($judul) > 255) {
        $errors['judul'] = 'Judul buku tidak boleh lebih dari 255 karakter.';
    }

    if (empty($errors)) {
        // Lanjutkan penyimpanan ke basis data
    }
}

Penjelasan Kode PHP Native: ​

  • Mengambil nilai input dari array global $_POST['judul'] dan membersihkan spasi di awal/akhir menggunakan trim().
  • Memeriksa kondisi apakah data kosong ($judul === '').
  • Menggunakan fungsi mb_strlen() untuk menghitung panjang karakter string secara multibyte-safe.
  • Menyimpan pesan kesalahan ke dalam array $errors untuk ditampilkan kembali pada halaman formulir.

2. Implementasi Laravel ​

php
<?php
use Illuminate\Http\Request;

public function store(Request $request)
{
    $validated = $request->validate([
        'judul' => 'required|string|max:255',
    ]);

    // Data $validated sudah bersih dan siap disimpan ke basis data
}

Penjelasan Kode Laravel: ​

  • $request->validate() menjalankan aturan validasi deklaratif dalam satu baris.
  • Jika ada aturan yang dilanggar, Laravel secara otomatis mengalihkan (redirect) pengguna kembali ke halaman formulir sebelumnya lengkap dengan pesan error dan input lama (old input).
  • Variabel $validated hanya berisi data yang telah lolos verifikasi.

Perbedaan Pendekatan: ​

Validasi manual pada PHP Native mengharuskan pengembang menulis pengondisian if-else dan pengelolaan array error secara mandiri. Pada Laravel, aturan validasi ditulis ringkas dalam bentuk string aturan (rule strings) dan penanganan redirect error dilakukan otomatis.


G. Perbandingan Pengelolaan Tampilan ​

Kebutuhan: Menampilkan daftar judul buku perpustakaan ke dalam dokumen HTML dengan aman.

1. Implementasi PHP Native ​

php
<!-- File: daftar_buku.php -->
<h1>Daftar Koleksi Buku</h1>

<?php if (!empty($books)): ?>
    <ul>
        <?php foreach ($books as $book): ?>
            <li><?= htmlspecialchars($book['judul'], ENT_QUOTES, 'UTF-8'); ?></li>
        <?php endforeach; ?>
    </ul>
<?php else: ?>
    <p>Belum ada buku yang tersedia.</p>
<?php endif; ?>

Penjelasan Kode PHP Native: ​

  • Logika pengulangan dan pengondisian disematkan langsung di dalam markup HTML menggunakan tag <?php ... ?>.
  • Teks judul wajib dibungkus dengan fungsi htmlspecialchars(..., ENT_QUOTES, 'UTF-8') sebelum dicetak untuk mencegah serangan XSS (Cross-Site Scripting).

2. Implementasi Laravel Blade ​

blade
{{-- File: resources/views/books/index.blade.php --}}
<h1>Daftar Koleksi Buku</h1>

@forelse ($books as $book)
    <p>{{ $book->judul }}</p>
@empty
    <p>Belum ada buku yang tersedia.</p>
@endforelse

Penjelasan Kode Laravel Blade: ​

  • Menggunakan directive @forelse ... @empty ... @endforelse yang secara otomatis menangani kondisi perulangan sekaligus kondisi ketika data kosong.
  • Sintaks kurung kurawal ganda {{ $book->judul }} secara otomatis menjalankan fungsi pengamanan htmlspecialchars() di balik layar, sehingga output dijamin aman tanpa perlu menuliskan nama fungsi panjang secara berulang.

Perbedaan Pendekatan: ​

PHP Native menyematkan tag PHP langsung di antara HTML dan membutuhkan sanitasi manual. Blade menyederhanakan penulisan kode tampilan melalui directive ringkas dan sanitasi data otomatis.


H. Perbandingan Session dan Authentication ​

Kebutuhan: Memeriksa apakah pengguna sudah login sebelum mengizinkan akses ke halaman manajemen perpustakaan.

1. Implementasi PHP Native ​

php
<?php
// File: admin_buku.php
session_start();

// Pemeriksaan status login
if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

$userNama = $_SESSION['user_nama'];

Penjelasan Kode PHP Native: ​

  • session_start() wajib dipanggil di setiap awal berkas sebelum ada teks HTML yang dikirim ke browser.
  • Memeriksa keberadaan key $_SESSION['user_id']. Jika tidak ada, pengguna dialihkan ke halaman login dengan header('Location: ...') dan eksekusi dihentikan dengan exit.

2. Implementasi Laravel ​

Pada Laravel, pemeriksaan autentikasi dipisahkan dari kode controller dan didelegasikan ke Middleware:

php
<?php
// Di dalam routes/web.php
use App\Http\Controllers\BookController;
use Illuminate\Support\Facades\Route;

Route::middleware('auth')->group(function () {
    Route::get('/admin/buku', [BookController::class, 'manage']);
});

Dan untuk memeriksa status autentikasi di dalam kode:

php
use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    $user = Auth::user();
}

Perbedaan Pendekatan: ​

PHP Native mengelola sesi global melalui variabel superglobal $_SESSION dengan pemeriksaan manual di setiap awal berkas. Laravel membungkus sesi dan autentikasi melalui lapisan middleware dan class Auth yang modular.


I. Perbandingan Aspek Keamanan ​

Keamanan aplikasi web tidak ditentukan oleh nama teknologi, melainkan bagaimana prinsip keamanan tersebut diimplementasikan. Berikut perbandingannya:

  1. SQL Injection:

    • PHP Native: Aman jika pengembang selalu menggunakan PDO Prepared Statements dan parameter binding. Rentan jika menggabungkan string kueri secara langsung ("SELECT * FROM books WHERE id = " . $_GET['id']).
    • Laravel: Aman secara bawaan karena Eloquent ORM dan Query Builder selalu menggunakan parameter binding pada setiap query.
  2. Cross-Site Scripting (XSS):

    • PHP Native: Aman jika pengembang konsisten membungkus setiap variabel cetak dengan htmlspecialchars().
    • Laravel: Aman secara bawaan melalui sintaks Blade {{ $variabel }} yang otomatis menyaring karakter berbahaya.
  3. Cross-Site Request Forgery (CSRF):

    • PHP Native: Pengembang harus membuat generator token acak di sesi, menyisipkannya ke formulir sebagai input tersembunyi (hidden input), dan memverifikasi kecocokan token secara manual saat formulir dikirim.
    • Laravel: Middleware ValidateCsrfToken aktif secara default untuk semua rute web. Pengembang cukup menuliskan directive @csrf di dalam formulir Blade.
  4. Penyimpanan Password:

    • PHP Native: Harus menggunakan fungsi hashing standar modern password_hash($password, PASSWORD_BCRYPT) dan memverifikasi dengan password_verify(). Dilarang keras menggunakan hashing lama seperti md5() atau sha1().
    • Laravel: Menggunakan class pembantu Hash::make($password) dan Hash::check() yang menerapkan algoritma Bcrypt atau Argon2id secara standar.

Perhatian Keamanan

Framework tidak membuat aplikasi Anda kebal dari segala celah secara otomatis. Pengembang tetap wajib memahami alur data yang masuk, memvalidasi input, dan tidak mem-bypass mekanisme proteksi yang telah disediakan.


J. Tabel Ringkasan Perbandingan ​

AspekPHP NativeLaravel 13
Pondasi BahasaPHP murniPHP 8.3+ berorientasi objek
Struktur ProjectDitentukan bebas oleh developerKonvensi standar industri yang seragam
RoutingBerkas fisik atau router switch-case manualDeklaratif terpusat di routes/web.php
Interaksi DatabaseKueri SQL manual via PDO / MySQLiEloquent ORM dan Query Builder
Migrasi DatabaseEksekusi file SQL manual di database toolFile migration terprogram via Artisan CLI
Validasi FormPemeriksaan fungsi logika if-else manualAturan deklaratif via $request->validate()
Template EnginePHP tertanam di dalam HTMLBlade Template Engine (.blade.php)
Manajemen SesiFungsi bawaan session_start() dan $_SESSIONSession manager terintegrasi
AutentikasiPengelolaan sesi dan pengalihan manualMiddleware auth dan class facade Auth
Proteksi CSRFPembuatan dan verifikasi token mandiriOtomatis via middleware dan directive @csrf
Kerja Sama TimMembutuhkan kesepakatan struktur dari awalSiap kolaborasi berkat konvensi yang sama

K. Kapan Menggunakan PHP Native dan Kapan Menggunakan Laravel? ​

Kedua pendekatan memiliki tempat dan kegunaannya masing-masing:

Gunakan PHP Native ketika: ​

  1. Sedang mempelajari fundamental web: Memahami cara kerja HTTP, header, cookie, session, dan dasar kueri basis data.
  2. Membuat skrip utilitas mandiri: Misalnya skrip konversi data sederhana atau tugas terjadwal kecil (cron job ringan).
  3. Aplikasi mikro berorientasi performa tinggi tanpa dependensi: Ketika instalasi framework berskala penuh dianggap terlalu berlebihan (overkill).

Gunakan Laravel ketika: ​

  1. Membangun aplikasi bisnis nyata: Seperti Sistem Informasi Perpustakaan, aplikasi inventaris, e-commerce, atau portal pembelajaran.
  2. Bekerja dalam tim: Memastikan seluruh anggota tim menulis kode dengan standar, struktur direktori, dan pola arsitektur yang sama.
  3. Membutuhkan fitur modern siap pakai: Membutuhkan sistem migrasi skema database, pengelolaan autentikasi, validasi input, dan template engine yang terintegrasi.
  4. Memprioritaskan keamanan dan kemudahan perawatan: Mengurangi risiko lupa menerapkan sanitasi keamanan mendasar.

L. Kesimpulan ​

PHP Native dan Laravel bukanlah dua hal yang saling bertentangan. PHP Native memberikan pemahaman fundamental mengenai cara kerja web, sedangkan Laravel memanfaatkan kemampuan bahasa PHP tersebut untuk menyediakan kerangka kerja yang rapi, aman, dan produktif.

Dengan memahami kedua pendekatan ini, Anda tidak hanya dapat menulis kode yang bekerja, tetapi juga memahami alasan logis di balik arsitektur yang Anda gunakan.


M. Materi Selanjutnya ​

Pada materi berikutnya, kita akan membahas lebih dalam salah satu pendekatan arsitektur yang didukung secara penuh oleh Laravel: 👉 04. Laravel sebagai Fullstack Framework: Mempelajari bagaimana Laravel mampu menangani logika backend sekaligus menyajikan antarmuka visual frontend menggunakan Blade dalam satu kesatuan sistem yang efisien.


Referensi Dokumentasi ​