Topik ini menelusuri perjalanan sebuah permintaan HTTP (request) di dalam Laravel, mulai dari berkas public/index.php sampai respons dikirim kembali ke browser. Pada akhir topik, peta komponen inti framework sudah tersusun, yaitu berkas bootstrap, kernel, service provider, dan router, sehingga alur dari permintaan sampai respons dapat dijelaskan langkah demi langkah.
Titik masuk public/index.php#
Seluruh permintaan HTTP yang masuk ke aplikasi Laravel diarahkan oleh konfigurasi server web ke satu berkas, yaitu public/index.php. Berkas ini adalah entry point, yaitu titik masuk aplikasi, dan isinya sengaja dibuat pendek karena tugasnya hanya memuat sisa framework, bukan logika aplikasi.
Isi berkas tersebut pada proyek bawaan adalah sebagai berikut.
// tidak-dijalankan
<?php
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;
}
// Register the Composer autoloader...
require __DIR__.'/../vendor/autoload.php';
// Bootstrap Laravel and handle the request...
/** @var Application $app */
$app = require_once __DIR__.'/../bootstrap/app.php';
$app->handleRequest(Request::capture());Blok kode di atas diberi penanda tidak-dijalankan karena memuat kelas Laravel yang membutuhkan bootstrap penuh framework. Membaca isi berkas ini tetap penting karena tiga langkahnya menjadi kerangka seluruh siklus. Pertama, berkas vendor/autoload.php yang dibuat Composer didaftarkan agar semua kelas dapat dimuat otomatis (autoloader). Kedua, bootstrap/app.php dimuat melalui require untuk memperoleh instance aplikasi. Ketiga, permintaan yang ditangkap Request::capture() diserahkan ke aplikasi melalui handleRequest().
bootstrap/app.php sebagai titik konfigurasi#
Berkas bootstrap/app.php membuat instance Application, objek aplikasi yang sekaligus menjadi service container, yakni wadah yang mengelola pembuatan dan penyediaan seluruh objek aplikasi. Pada struktur modern Laravel 11 ke atas, berkas inilah pusat konfigurasi aplikasi, sehingga pendaftaran rute, middleware, dan penanganan exception dilakukan di sini melalui rantai pemanggilan metode yang mudah dibaca.
Isi berkasnya pada proyek contoh adalah sebagai berikut.
// tidak-dijalankan
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware): void {
//
})
->withExceptions(function (Exceptions $exceptions): void {
$exceptions->shouldRenderJsonWhen(
fn (Request $request) => $request->is('api/*') || $request->expectsJson(),
);
})->create();Metode withRouting() menunjuk berkas routes/web.php untuk rute web dan routes/console.php untuk perintah konsol, serta mendaftarkan rute pemeriksaan kesehatan /up. Metode withMiddleware() adalah tempat middleware aplikasi disesuaikan, sedangkan withExceptions() mengatur cara error dilaporkan dan dirender. Perhatikan bahwa tidak ada app/Http/Kernel.php pada struktur ini.
Kernel HTTP dan bootstrapper#
Setelah aplikasi terbentuk, handleRequest() menyerahkan permintaan ke HTTP kernel, yaitu objek Illuminate\Foundation\Http\Kernel yang menjadi pintu tunggal semua permintaan HTTP. Cara kerjanya sederhana, yaitu menerima objek Request dan mengembalikan objek Response.
Sebelum permintaan dieksekusi, kernel menjalankan serangkaian bootstrapper, yaitu kelas yang menyiapkan kondisi framework, misalnya memuat berkas konfigurasi .env, mengatur penanganan error, mengaktifkan logging, dan mendeteksi lingkungan aplikasi. Setelah itu, permintaan melewati tumpukan middleware global. Middleware adalah lapisan yang memeriksa atau memfilter permintaan sebelum sampai ke rute, misalnya membaca dan menulis session, memeriksa mode pemeliharaan, dan memverifikasi token CSRF. Apabila salah satu middleware menolak permintaan, eksekusi berhenti dan respons penolakan langsung dikembalikan.
Service provider: register dan boot#
Salah satu langkah bootstrapping terpenting adalah memuat service provider, yaitu kelas yang mendaftarkan dan menyiapkan layanan inti framework seperti database, validasi, dan routing. Daftar provider milik aplikasi ditunjuk oleh berkas bootstrap/providers.php berikut.
// tidak-dijalankan
<?php
use App\Providers\AppServiceProvider;
return [
AppServiceProvider::class,
];Framework sendiri menambahkan puluhan provider internal, sedangkan daftar di atas memuat provider milik aplikasi. Eksekusinya berlangsung dua fase yang berurutan. Pada fase pertama, metode register() dipanggil pada seluruh provider untuk mengikat layanan ke service container. Pada fase kedua, setelah semua register() selesai, metode boot() dipanggil satu per satu. Urutan ini menjamin bahwa saat boot() sebuah provider berjalan, seluruh binding pada service container sudah tersedia. Berkas app/Providers/AppServiceProvider.php dari proyek bawaan hampir kosong dan disediakan sebagai tempat binding milik aplikasi.
Router mengirimkan permintaan#
Setelah metode boot() seluruh provider selesai dijalankan, permintaan diserahkan ke router. Router mencocokkan URI dan metode HTTP permintaan dengan daftar rute yang terdaftar, lalu menjalankan middleware khusus milik rute yang cocok. Apabila permintaan lolos, router memanggil closure atau metode controller yang ditunjuk rute tersebut, dan nilai yang dikembalikan menjadi respons.
Siklus ini dapat diverifikasi tanpa server web karena kernel dapat menerima permintaan sintetis langsung dari command line. Perintah berikut membuat permintaan GET / melalui Request::create(), menjalankannya melalui kernel HTTP, lalu menampilkan kode statusnya.
cd ~/aplikasi-catatan
# kirim permintaan sintetis GET / melalui kernel HTTP
php artisan tinker --execute='echo app(\Illuminate\Contracts\Http\Kernel::class)->handle(\Illuminate\Http\Request::create("/"))->getStatusCode();'200Kode status 200 menunjukkan rute / berhasil dicocokkan dan metodenya mengembalikan respons normal. Respons yang dikembalikan rute bergerak kembali melewati rantai middleware rute, sehingga aplikasi masih dapat mengubahnya. Terakhir, handleRequest() memanggil metode send() pada objek respons untuk mengirimkan isinya ke browser, dan siklus permintaan selesai.
Kegagalan pencocokan juga berakhir di router. Apabila permintaan tidak cocok dengan rute mana pun, router melempar exception NotFoundHttpException, dan exception handler mengubahnya menjadi halaman 404. Mekanisme yang sama berlaku untuk error yang terjadi saat rute dieksekusi, yaitu exception apa pun ditangkap pada satu titik terpusat lalu dirender menjadi respons yang layak. Dengan demikian, tidak ada jalur eksekusi yang mengakhiri permintaan tanpa respons.
Ringkasan#
public/index.phpadalah titik masuk tunggal, yaitu memuat autoloader Composer, memperoleh aplikasi daribootstrap/app.php, lalu menyerahkan permintaan melaluihandleRequest().bootstrap/app.phpadalah pusat konfigurasi aplikasi modern, yaitu mendaftarkan berkas rute, middleware, dan penanganan exception.- HTTP kernel menjalankan bootstrapper dan middleware global, sedangkan daftar service provider aplikasi ada di
bootstrap/providers.phpdengan urutanregister()lebih dahulu, laluboot(). - Router mencocokkan permintaan dengan rute, memanggil aksinya, dan respons bergerak kembali melalui middleware sebelum dikirim ke browser.
Referensi#
- Request Lifecycle — Laravel — Dokumentasi resmi yang menjadi dasar urutan siklus permintaan pada topik ini.
- Configuration — Laravel
— Menjelaskan peran berkas konfigurasi dan
.envyang dimuat bootstrapper.