Ketika menggunakan suatu alat apa pun itu di “dunia nyata”, Kita akan merasa lebih percaya diri jika memahami bagaimana cara kerja alat tersebut. Pengembangan aplikasi juga demikian. Ketika kita memahami cara kerja alat pengembangan seperti framework yang kita gunakan, kita akan merasa lebih nyaman dan percaya diri dalam menggunakannya. Pada artikel ini kita akan membahas terkait gambaran umum bagaimana cara kerja framework Laravel. Dengan mengenal framework Laravel secara keseluruhan dengan lebih baik, semuanya akan terasa lebih “ajaib” dan kita akan lebih percaya diri dalam membangun sebuah aplikasi.
Laravel Request Lifecycle
index.php : Titik Awal Segalanya
Pintu masuk utama untuk semua request /permintaan ke aplikasi Laravel yaitu public/index.php
. Semua permintaan akan dialihkan ke file ini melalui konfigurasi web server seperti Apache/Nginx. File index.php sendiri tidak memuat banyak kode, melainkan berfungsi sebagai entry point (titik awal) untuk memuat framework Laravel.
Pertama, file index.php akan memuat definisi autoloader yang dibuat oleh Composer. Kemudian, file ini akan merequest instance aplikasi Laravel dari file bootstrap/app.php
. Tindakan pertama yang dilakukan Laravel adalah membuat instance aplikasi/service container. Container ini akan digunakan untuk menyimpan dan menyediakan semua komponen yang dibutuhkan aplikasi.
// public/index.php
...
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Kernel::class);
...
Kernel: HTTP / Console
Setelah itu, permintaan yang masuk akan dikirim ke HTTP kernel atau console kernel, tergantung jenis permintaan yang masuk ke aplikasi. Kedua kernel ini berperan sebagai titik sentral di mana seluruh permintaan akan melaluinya. Sementara mari fokus pada HTTP kernel, yang terletak di file app/Http/Kernel.php
.
HTTP kernel mewarisi class Illuminate\Foundation\Http\Kernel
, yang mendefinisikan array bootstrapper yang akan dijalankan sebelum permintaan dieksekusi. Bootstrapper ini akan mengonfigurasi penanganan error, logging, deteksi app environment, dan tugas-tugas lainnya yang harus dilakukan sebelum permintaan benar-benar ditangani. Pada umumnya, kelas-kelas ini akan mengkonfigurasi Laravel di internal, jadi kita tidak perlu mengkhawatirkannya.
Middleware: Filter permintaan
Sebelum permintaan diproses lebih lanjut oleh aplikasi, permintaan akan melewati daftar middleware HTTP yang telah ditentukan oleh HTTP kernel. Middleware berfungsi sebagai filter yang dapat memodifikasi permintaan atau melakukan validasi tertentu sebelum permintaan sampai ke controller.
Ada dua jenis middleware pada kernel:
- Global Middleware: Middleware ini akan selalu dijalankan untuk setiap permintaan tanpa memandang route mana yang dipanggil. Misalnya, middleware dapat digunakan untuk memeriksa apakah pengguna sudah terotentikasi atau memaksa aplikasi menggunakan HTTPS.
- Route Middleware: Middleware ini hanya akan dijalankan untuk permintaan yang melewati route tertentu yang telah diikatkan dengan middleware tersebut. Misalnya, hanya permintaan ke halaman admin-lah yang memerlukan otorisasi.
Dengan menggunakan middleware, kita dapat menambahkan berbagai logika validasi dan manipulasi permintaan secara terstruktur sebelum permintaan diteruskan ke proses selanjutnya.
Service Provider
Salah satu tahap bootstrapping kernel paling penting adalah memuat service provider aplikasi. Service provider bertugas untuk memuat semua komponen framework seperti database, antrian, validasi, dan routing.
Semua service provider aplikasi dikonfigurasi pada array ‘providers’ dalam file config/app.php
. Laravel akan mengiterasi daftar ini dan membuat instance setiap provider. Setelah itu, metode register akan dipanggil untuk semua provider. Ketika semua provider telah terdaftar, metode boot akan dipanggil.
// config/app.php
...
'providers' => ServiceProvider::defaultProviders()->merge([
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
])->toArray(),
...
Service provider merupakan aspek terpenting dalam proses bootstrapping framework karena mengkonfigurasi berbagai fitur Laravel. Dapat dikatakan setiap fitur utama Laravel dimuat melalui service provider. Ia memastikan seluruh komponen siap sebelum permintaan ditangani.
Routing ke rute yang cocok
Salah satu service provider paling penting dalam laravel adalah App\Providers\RouteServiceProvider
. Service provider ini bertugas untuk memuat berkas-berkas route yang terdapat dalam direktori routes/
.
// app/Providers/RouteServiceProvider.php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to your application's "home" route.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*/
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
}
Setelah aplikasi selesai di bootstrapping dan semua service provider terdaftar, permintaan akan diteruskan ke router (web.php / api.php) untuk melakukan dispatching. Router akan mengarahkan permintaan ke route atau controller tertentu, serta menjalankan middleware yang diikat ke route tersebut.
// routes/web.php
Route::get('/', function() {
return view('welcome');
});
Route::get('/users', [UserController::class, 'index'])->middleware('auth');
Controller : Logika Bisnis Aplikasi
Ketika request mencapai controller, di sinilah logika bisnis aplikasi berada. Controller akan memproses request sesuai kebutuhan, seperti mengambil data dari database, memproses input pengguna, atau menjalankan berbagai layanan internal.
Misalnya, pada contoh berikut, controller mengambil data dari database dan mengembalikannya dalam bentuk view:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index() {
$users = User::all();
return view('users.index', compact('users'));
}
}
Finishing dengan Response
Setelah metode route atau controller mengembalikan respons, respons akan berjalan kembali ke luar melalui middleware route, memberikan kesempatan kepada aplikasi untuk memodifikasi atau memeriksa respons yang keluar.
// public/index.php
....
....
$response = $kernel->handle(
$request = Request::capture()
)->send();
$kernel->terminate($request, $response);
Terakhir, setelah respons kembali melalui middleware, metode handle pada HTTP kernel akan mengembalikan objek respons dan file index.php akan memanggil metode send pada respons yang dikembalikan. Selanjutnya metode send mengirimkan konten respons ke browser/web pengguna dan perjalanan melalui seluruh siklus hidup request Laravel pun selesaii!
Kesimpulan
Siklus hidup request di Laravel terdiri dari beberapa tahapan penting yang dimulai dari permintaan masuk ke server web hingga akhirnya menghasilkan respons yang dikirimkan kembali ke pengguna. Memahami setiap tahapan ini memungkinkan developer untuk lebih efisien dalam membangun aplikasi, memecahkan masalah yang muncul, dan mengoptimalkan performa aplikasi.
Jadi, saat kamu mengirimkan permintaan ke aplikasi Laravel, banyak hal terjadi di balik layar untuk memastikan bahwa aplikasi dapat merespons dengan cepat, aman, dan sesuai dengan logika yang diinginkan.