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.phpPada 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
└── .envPada 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 ... casememeriksa 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 methodindex()padaBookController.- 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_EXCEPTIONmemastikan setiap kegagalan query melempar exception sehingga dapat ditangani dengan bloktry-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:
Bookadalah Model Eloquent yang merepresentasikan tabelbooksdi 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 objekCollection.
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 menggunakantrim(). - Memeriksa kondisi apakah data kosong (
$judul === ''). - Menggunakan fungsi
mb_strlen()untuk menghitung panjang karakter string secara multibyte-safe. - Menyimpan pesan kesalahan ke dalam array
$errorsuntuk 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
$validatedhanya 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>
@endforelsePenjelasan Kode Laravel Blade:
- Menggunakan directive
@forelse ... @empty ... @endforelseyang secara otomatis menangani kondisi perulangan sekaligus kondisi ketika data kosong. - Sintaks kurung kurawal ganda
{{ $book->judul }}secara otomatis menjalankan fungsi pengamananhtmlspecialchars()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 denganheader('Location: ...')dan eksekusi dihentikan denganexit.
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:
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.
- PHP Native: Aman jika pengembang selalu menggunakan PDO Prepared Statements dan parameter binding. Rentan jika menggabungkan string kueri secara langsung (
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.
- PHP Native: Aman jika pengembang konsisten membungkus setiap variabel cetak dengan
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
ValidateCsrfTokenaktif secara default untuk semua rute web. Pengembang cukup menuliskan directive@csrfdi dalam formulir Blade.
Penyimpanan Password:
- PHP Native: Harus menggunakan fungsi hashing standar modern
password_hash($password, PASSWORD_BCRYPT)dan memverifikasi denganpassword_verify(). Dilarang keras menggunakan hashing lama sepertimd5()atausha1(). - Laravel: Menggunakan class pembantu
Hash::make($password)danHash::check()yang menerapkan algoritma Bcrypt atau Argon2id secara standar.
- PHP Native: Harus menggunakan fungsi hashing standar modern
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
| Aspek | PHP Native | Laravel 13 |
|---|---|---|
| Pondasi Bahasa | PHP murni | PHP 8.3+ berorientasi objek |
| Struktur Project | Ditentukan bebas oleh developer | Konvensi standar industri yang seragam |
| Routing | Berkas fisik atau router switch-case manual | Deklaratif terpusat di routes/web.php |
| Interaksi Database | Kueri SQL manual via PDO / MySQLi | Eloquent ORM dan Query Builder |
| Migrasi Database | Eksekusi file SQL manual di database tool | File migration terprogram via Artisan CLI |
| Validasi Form | Pemeriksaan fungsi logika if-else manual | Aturan deklaratif via $request->validate() |
| Template Engine | PHP tertanam di dalam HTML | Blade Template Engine (.blade.php) |
| Manajemen Sesi | Fungsi bawaan session_start() dan $_SESSION | Session manager terintegrasi |
| Autentikasi | Pengelolaan sesi dan pengalihan manual | Middleware auth dan class facade Auth |
| Proteksi CSRF | Pembuatan dan verifikasi token mandiri | Otomatis via middleware dan directive @csrf |
| Kerja Sama Tim | Membutuhkan kesepakatan struktur dari awal | Siap 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:
- Sedang mempelajari fundamental web: Memahami cara kerja HTTP, header, cookie, session, dan dasar kueri basis data.
- Membuat skrip utilitas mandiri: Misalnya skrip konversi data sederhana atau tugas terjadwal kecil (cron job ringan).
- Aplikasi mikro berorientasi performa tinggi tanpa dependensi: Ketika instalasi framework berskala penuh dianggap terlalu berlebihan (overkill).
Gunakan Laravel ketika:
- Membangun aplikasi bisnis nyata: Seperti Sistem Informasi Perpustakaan, aplikasi inventaris, e-commerce, atau portal pembelajaran.
- Bekerja dalam tim: Memastikan seluruh anggota tim menulis kode dengan standar, struktur direktori, dan pola arsitektur yang sama.
- Membutuhkan fitur modern siap pakai: Membutuhkan sistem migrasi skema database, pengelolaan autentikasi, validasi input, dan template engine yang terintegrasi.
- 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.