Merangkai Semua Komponen: Membangun Web Application Modern Menggunakan Framework & Composer
Kita telah membongkar bagaimana web bekerja, evolusi PHP modern, exception handling yang aman, penggunaan Composer, standar PSR-4, komponen terpisah seperti Guzzle dan Eloquent, arsitektur MVC, hingga pilar-pilar framework dan security checklist (SQLi, XSS, CSRF).
Namun, pengetahuan terpisah ibarat potongan lego yang berserakan. Sebuah aplikasi web nyata tidak dibangun hanya dari satu fitur, melainkan dari rangkaian harmonis antara seluruh komponen tersebut.
Di artikel penutup seri ini, kita akan merangkai semua potongan puzzle menjadi satu peta jalan (grand blueprint) pembuatan aplikasi web modern—mulai dari tahap inisialisasi, arsitektur sistem, contoh implementasi pada Laravel, Yii2, dan CodeIgniter 4, hingga proses deployment ke server live.
1. Arsitektur Sistem Utuh (The Master Blueprint)
Sebelum menulis satu baris kode pun, seorang Software Engineer harus memahami bagaimana seluruh komponen saling berinteraksi di bawah kap mesin aplikasi web modern.
[ BROWSER CLIENT ]
│
1. HTTP Request
│
▼
┌──────────────┐
│ ROUTING │
└──────┬───────┘
│
2. Filter Akses
│
▼
┌──────────────┐
│ MIDDLEWARE │ ── (Cek Auth, Filter & Token CSRF)
└──────┬───────┘
│
3. Teruskan Request
│
▼
┌──────────────┐
│ CONTROLLER │ ── (Otak Pengatur Alur)
└──────┬───────┘
│
┌────────────────────────┴────────────────────────┐
│ │
4. Olah Data 5. Panggil Paket
│ │
▼ ▼
┌─────────────────────┐ ┌──────────────────────┐
│ MODEL (ORM) │ │ COMPOSER PACKAGES │
└──────────┬──────────┘ │ (Guzzle, Dompdf, dll)│
│ └──────────┬───────────┘
Koneksi Database │
│ Kembalikan Hasil
▼ │
┌─────────────────────┐ │
│ DATABASE │ │
└──────────┬──────────┘ │
│ │
└────────────────────────┬───────────────────────┘
│
6. Kirim Data Mentah
│
▼
┌──────────────┐
│ VIEW │ ── (Templating Engine & XSS Protection)
└──────┬───────┘
│
7. Render HTML
│
▼
[ BROWSER CLIENT ]
2. Tahap 1: Inisialisasi & Pengaturan Fondasi Proyek
Setiap aplikasi web yang kokoh dimulai dari struktur lingkungan kerja yang bersih dan terstandar.
1. Inisialisasi Proyek Framework
Gunakan Composer untuk mengunduh dan menyiapkan kerangka aplikasi sesuai framework pilihanmu:
-
Pilihan A — Laravel:
Bashcomposer create-project laravel/laravel toko-modern -
Pilihan B — Yii2 (Basic Template):
Bashcomposer create-project --prefer-dist yiisoft/yii2-app-basic toko-modern -
Pilihan C — CodeIgniter 4:
Bashcomposer create-project codeigniter4/appstarter toko-modern
2. Memasukkan Paket Dependensi Pihak Ketiga
Tambahkan paket-paket pendukung dari Packagist.org via Composer:
Bash
# Untuk HTTP Client / Integrasi API
composer require guzzlehttp/guzzle
# Untuk membuat laporan PDF instan
composer require barryvdh/laravel-dompdf # (Untuk Laravel)
composer require kartik-v/yii2-mpdf # (Untuk Yii2)
composer require dompdf/dompdf # (Untuk CodeIgniter 4 / Generic PHP)
3. Keamanan Konfigurasi Lingkungan
Simpan seluruh kredensial sensitif di berkas konfigurasi lingkungan yang terisolasi dari repositori Git:
-
Pada Laravel & CodeIgniter 4 (
Ini, TOML.env):# Laravel DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_DATABASE=toko_modern DB_USERNAME=user_secure DB_PASSWORD=password_rahasia_123 # CodeIgniter 4 (.env) database.default.hostname = 127.0.0.1 database.default.database = toko_modern database.default.username = user_secure database.default.password = password_rahasia_123 database.default.DBDriver = MySQLi -
Pada Yii2 (
PHPconfig/db.php):return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=toko_modern', 'username' => 'user_secure', 'password' => 'password_rahasia_123', 'charset' => 'utf8', ];
3. Tahap 2: Pembangunan Core System (MVC dalam Aksi)
Mari kita simulasikan alur kerja pembuatan fitur Detail Order & Cetak Invoice pada tiga framework MVC terpopuler: Laravel, Yii2, dan CodeIgniter 4.
A. Implementasi pada Framework Laravel
1. Routing & Middleware
PHP
// routes/web.php
use App\Http\Controllers\OrderController;
Route::middleware(['auth'])->group(function () {
Route::get('/order/{id}', [OrderController::class, 'show']);
Route::post('/order/process', [OrderController::class, 'process']);
});
2. Controller & ORM (Eloquent)
PHP
// app/Http/Controllers/OrderController.php
namespace App\Http\Controllers;
use App\Models\Order;
use Barryvdh\DomPDF\Facade\Pdf;
class OrderController extends Controller
{
public function show($id)
{
$order = Order::findOrFail($id);
return view('order.detail', compact('order'));
}
public function downloadPdf($id)
{
$order = Order::findOrFail($id);
$pdf = Pdf::loadView('pdf.invoice', compact('order'));
return $pdf->download("invoice-{$order->invoice_number}.pdf");
}
}
3. View (Blade)
HTML
<!-- resources/views/order/detail.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
<h2>Detail Invoice: {{ $order->invoice_number }}</h2>
<p>Total Bayar: Rp {{ number_format($order->total_harga) }}</p>
<!-- Form aksi dengan proteksi CSRF Token -->
<form action="/order/process" method="POST">
@csrf
<input type="hidden" name="order_id" value="{{ $order->id }}">
<button type="submit" class="btn btn-primary">Konfirmasi Pembayaran</button>
</form>
</div>
@endsection
B. Implementasi pada Framework Yii2
1. Controller, Filter, & Active Record
PHP
// controllers/OrderController.php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\AccessControl;
use app\models\Order;
use kartik\mpdf\Pdf;
class OrderController extends Controller
{
// AccessControl setara dengan Middleware
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'], // User terautentikasi
],
],
],
];
}
public function actionShow($id)
{
$order = $this->findModel($id);
return $this->render('detail', ['order' => $order]);
}
public function actionDownloadPdf($id)
{
$order = $this->findModel($id);
$content = $this->renderPartial('invoice_pdf', ['order' => $order]);
$pdf = new Pdf([
'mode' => Pdf::MODE_UTF8,
'content' => $content,
'filename' => "invoice-{$order->invoice_number}.pdf",
]);
return $pdf->render();
}
protected function findModel($id)
{
if (($model = Order::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('Halaman tidak ditemukan.');
}
}
2. View (Yii2 Native & Html Helper)
PHP
<?php
// views/order/detail.php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$this->title = 'Detail Invoice: ' . $order->invoice_number;
?>
<div class="order-detail container">
<h2><?= Html::encode($this->title) ?></h2>
<p>Total Bayar: Rp <?= number_format($order->total_harga) ?></p>
<?php $form = ActiveForm::begin(['action' => ['order/process']]); ?>
<?= Html::hiddenInput('order_id', $order->id) ?>
<div class="form-group">
<?= Html::submitButton('Konfirmasi Pembayaran', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
C. Implementasi pada Framework CodeIgniter 4
Di CodeIgniter 4, filter keamanan diterapkan via Filters, query database diolah via Model / Query Builder, dan sanitasi output menggunakan fungsi bawaan esc().
1. Routing & Filter (CodeIgniter 4)
PHP
// app/Config/Routes.php
use App\Controllers\OrderController;
// Rute ini dilindungi oleh Filter 'auth'
$routes->group('order', ['filter' => 'auth'], function($routes) {
$routes->get('show/(:num)', [OrderController::class, 'show']);
$routes->post('process', [OrderController::class, 'process']);
});
2. Controller & Model (CodeIgniter 4)
PHP
// app/Controllers/OrderController.php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Models\OrderModel;
use Dompdf\Dompdf; // Menggunakan paket Dompdf bawaan Composer
class OrderController extends BaseController
{
public function show($id)
{
$model = new OrderModel();
$order = $model->find($id);
if (!$order) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
return view('order/detail', ['order' => $order]);
}
public function downloadPdf($id)
{
$model = new OrderModel();
$order = $model->find($id);
$html = view('pdf/invoice', ['order' => $order]);
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->render();
$dompdf->stream("invoice-{$order['invoice_number']}.pdf");
}
}
3. View (CodeIgniter 4 View with Escaping & CSRF)
HTML
<!-- app/Views/order/detail.php -->
<?= $this->extend('layouts/app') ?>
<?= $this->section('content') ?>
<div class="container">
<!-- esc() adalah fungsi proteksi XSS bawaan CodeIgniter -->
<h2>Detail Invoice: <?= esc($order['invoice_number']) ?></h2>
<p>Total Bayar: Rp <?= number_format($order['total_harga']) ?></p>
<form action="/order/process" method="POST">
<!-- Helper csrf_field() memasukkan token CSRF rahasia -->
<?= csrf_field() ?>
<input type="hidden" name="order_id" value="<?= esc($order['id']) ?>">
<button type="submit" class="btn btn-primary">Konfirmasi Pembayaran</button>
</form>
</div>
<?= $this->endSection() ?>
4. Tahap 3: Security Audit Checklist Sebelum Launching
Sebelum kodenya diunggah ke server production, lakukan audit singkat menggunakan daftar periksa keamanan berikut:
| Area Keamanan | Status | Metode Perlindungan |
| SQL Injection | ✅ | Seluruh query database menggunakan ORM / Prepared Statements (Eloquent / Active Record / CI4 Model). |
| Cross-Site Scripting (XSS) | ✅ | Semua pencetakan variabel di View menggunakan {{ }} (Blade), Html::encode() (Yii2), atau esc() (CI4). |
| Cross-Site Request Forgery (CSRF) | ✅ | Seluruh form berjenis POST/PUT/DELETE menyertakan token CSRF (@csrf, ActiveForm, atau csrf_field()). |
| Penyembunyian Error | ✅ | Matikan mode debug di .env (APP_DEBUG=false atau CI_ENVIRONMENT=production) agar error mentah tidak bocor. |
| Penyimpanan Password | ✅ | Kata sandi pengguna terenkripsi menggunakan password_hash() / Bcrypt. |
5. Tahap 4: Strategi Deployment ke Server Production
Mendistribusikan aplikasi ke server live memerlukan perlakuan khusus agar aplikasi berjalan dengan kecepatan maksimal dan stabil.
1. Optimalisasi Composer di Server
Saat menjalankan perintah instalasi paket di server production, jangan sertakan paket dev dan aktifkan autoloader optimization:
Bash
composer install --no-dev --optimize-autoloader
2. Pengaturan Dokumen Server (Web Server Root)
Arahkan konfigurasi Domain / Virtual Host web server (Nginx atau Apache) ke folder publik masing-masing framework:
-
Laravel / CodeIgniter 4: Arahkan ke folder
public/ -
Yii2 Basic: Arahkan ke folder
web/
Langkah ini menjamin berkas rahasia seperti .env, konfigurasi internal, dan source code aplikasi tersimpan aman di luar jangkauan browser pengguna.
Nginx
# Contoh Konfigurasi Nginx untuk Laravel & CI4 (folder /public) atau Yii2 (folder /web)
server {
listen 80;
server_name tokoanda.com;
# Arahkan root ke folder publik (Laravel/CI4 = /public | Yii2 = /web)
root /var/www/toko-modern/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
3. Pemeliharaan Berkelanjutan
Aplikasi web bersifat dinamis. Secara berkala, periksa dan perbarui dependensi paketmu untuk menutup celah keamanan (security patches) yang ditemukan oleh komunitas:
Bash
# Periksa paket mana saja yang memiliki update aman
composer outdated
Kesimpulan Seri: Menjadi Software Engineer PHP Modern
Dengan menyelesaikan artikel ke-18 ini, kamu telah resmi bertransformasi dari sekadar penulis skrip PHP pasif menjadi seorang Web Application Architect yang berpikir secara terstruktur, modular, dan memprioritaskan keamanan.
Ingatlah tiga prinsip utama pengembangan perangkat lunak modern:
-
Jangan reinvent the wheel: Gunakan Composer dan komponen yang sudah teruji untuk menyelesaikan tugas umum.
-
Patuhi Standar: Gunakan PSR-4 dan pola MVC (baik di Laravel, Yii2, CodeIgniter, maupun Symfony) agar kodedu dapat dipahami oleh tim pengembang global.
-
Keamanan adalah Kebiasaan: Terapkan perlindungan data di setiap baris kode sejak hari pertama pengodean.
Selamat membangun aplikasi web modern pertama kamu yang tangguh dan selamat berkarya di ekosistem PHP dunia!




