Laravel Essential
File app\Providers\AppServiceProvider.php
php
namespace App\Providers;
use Carbon\CarbonImmutable;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Request;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Model::preventLazyLoading(true);
Model::unguard();
DB::prohibitDestructiveCommands(App::isProduction());
Date::use(CarbonImmutable::class);
Vite::useAggressivePrefetching();
if (App::environment(['production'])) {
URL::forceHttps();
URL::forceScheme('https');
URL::forceRootUrl(Config::get('app.url'));
Request::server->set('HTTPS', Request::header('X-Forwarded-Proto', 'https') == 'https' ? 'on' : 'off');
}
}
}Penjelasan
1. Model::preventLazyLoading(true);
- Tujuan: Mengaktifkan mekanisme pencegahan Lazy Loading pada model Eloquent.
- Penjelasan: Lazy Loading adalah penyebab utama masalah performa N+1 Query di Laravel, di mana Anda membuat 1 kueri utama untuk mendapatkan model, dan kemudian N kueri tambahan untuk mengambil relasinya satu per satu. Dengan menyetelnya ke
true(biasanya hanya di lingkungan development dan staging), Laravel akan melempar exception jika Anda mencoba mengakses relasi tanpa menggunakan Eager Loading (with()). - Manfaat: Meningkatkan performa aplikasi secara drastis dengan memaksa developer menulis kode yang lebih efisien.
2. Model::unguard();
- Tujuan: Menonaktifkan Mass Assignment Protection (perlindungan penugasan massal) untuk semua model secara global.
- Penjelasan: Secara default, Eloquent menggunakan properti
$fillableatau$guardedpada model untuk melindungi kolom sensitif (misalnyais_admin,password) agar tidak diubah melalui operasi massal (create()atauupdate()dengan array input). - Peringatan: Menggunakan
unguard()secara global sangat tidak disarankan di aplikasi Production karena membuka celah keamanan serius yang dikenal sebagai Mass Assignment Vulnerability. Metode ini umumnya hanya digunakan untuk database seeding atau testing.
3. DB::prohibitDestructiveCommands(App::isProduction());
- Tujuan: Mencegah eksekusi perintah database yang merusak di lingkungan Production.
- Penjelasan: Perintah merusak termasuk
DROP TABLE,TRUNCATE TABLE, dan sejenisnya. Dengan meneruskanApp::isProduction()(yang mengembalikantruehanya di Production), Laravel akan melarang kueri SQL mentah yang merusak untuk dijalankan, memberikan lapisan keamanan tambahan terhadap penghapusan data yang tidak disengaja. - Manfaat: Perlindungan data kritis di lingkungan live.
4. Date::use(CarbonImmutable::class);
- Tujuan: Mengubah class penanganan tanggal dan waktu default Laravel dari
CarbonkeCarbonImmutable. - Penjelasan:
Carbonbersifat mutable (dapat diubah), yang berarti operasi seperti$date->addDays(5)akan mengubah objek$dateaslinya.CarbonImmutablebersifat immutable (tidak dapat diubah), yang berarti setiap operasi akan mengembalikan objek baru, menjaga objek asli tetap utuh. - Manfaat: Mengurangi bug tak terduga dalam kode yang melibatkan manipulasi tanggal, karena Anda dapat yakin bahwa objek tanggal tidak berubah secara tidak sengaja.
5. Vite::useAggressivePrefetching();
- Tujuan: Mengaktifkan strategi Aggressive Prefetching untuk aset frontend (JS, CSS) yang dikelola oleh Vite.
- Penjelasan: Prefetching membuat browser mengunduh aset yang mungkin dibutuhkan di masa depan di latar belakang. Strategi agresif meningkatkan kecepatan navigasi antar halaman (page load) karena aset sudah di-cache.
- Manfaat: Meningkatkan performa dan pengalaman pengguna (User Experience) di frontend.
Konfigurasi URL dan HTTPS (Hanya di Production)
Blok kode ini hanya dieksekusi ketika aplikasi berada di lingkungan Production (atau lingkungan yang ditentukan dalam kondisi if). Tujuannya adalah memastikan aplikasi berfungsi dengan baik di bawah HTTPS, terutama ketika di-deploy di belakang Load Balancer atau Reverse Proxy.
6. if (App::environment(['production'])) { ... }
- Tujuan: Membatasi eksekusi konfigurasi keamanan HTTPS ke lingkungan Production saja.
- Penjelasan: Laravel menggunakan helper
App::environment()untuk memeriksa lingkungan saat ini (yang didefinisikan dalam variabelAPP_ENVdi berkas.env). Konfigurasi di dalam blok ini bersifat sensitif terhadap deployment dan umumnya tidak diperlukan (bahkan dapat menyebabkan masalah) di lingkungan development lokal.
7. URL::forceHttps(); dan URL::forceScheme('https');
- Tujuan: Memaksa semua URL yang dihasilkan oleh helper dan Facade Laravel menggunakan skema HTTPS.
- Penjelasan: Ketika Anda menggunakan fungsi seperti
route('nama.rute')atau helperurl(), Laravel akan memastikan tautan yang dihasilkan dimulai denganhttps://(misalnyahttps://myapp.com/halaman). Ini penting untuk menghindari masalah Mixed Content di browser yang terjadi ketika halaman HTTPS memuat aset (gambar, script) melalui HTTP.
8. URL::forceRootUrl(Config::get('app.url'));
- Tujuan: Memastikan semua tautan absolut (yang memiliki domain lengkap) menggunakan URL dasar yang ditentukan dalam konfigurasi.
- Penjelasan: Fungsi ini mengambil nilai dari kunci
urldi berkasconfig/app.php(yang biasanya diset dari variabel lingkunganAPP_URLdi.env). Ini sangat penting jika Anda menjalankan tugas queue (antrian) atau command line yang perlu menghasilkan tautan, karena tanpa ini, Laravel mungkin menggunakan URL localhost atau URL yang salah.
9. Request::server->set('HTTPS', Request::header('X-Forwarded-Proto', 'https') == 'https' ? 'on' : 'off');
- Tujuan: Mengatasi masalah SSL/HTTPS di belakang Load Balancer (Reverse Proxy).
- Penjelasan: Di lingkungan cloud atau server dengan Load Balancer (seperti AWS ELB, Nginx Proxy), koneksi HTTPS dari pengguna diakhiri oleh Load Balancer (ini disebut SSL Termination). Load Balancer kemudian berkomunikasi dengan server Laravel menggunakan koneksi HTTP biasa. Akibatnya, Laravel mengira permintaan yang masuk adalah HTTP. Baris kode ini:
- Membaca header khusus (
X-Forwarded-Proto) yang dikirim oleh Load Balancer yang mengonfirmasi bahwa permintaan aslinya adalah HTTPS. - Kemudian secara manual mengatur variabel server
HTTPSdi Laravel menjadi'on', sehingga Laravel menyadari bahwa permintaan tersebut seharusnya dianggap sebagai HTTPS.
- Membaca header khusus (
- Manfaat: Memastikan fungsi keamanan Laravel yang bergantung pada pengecekan SSL (misalnya, middleware
ForceHttpsatau pengecekanrequest()->secure()) bekerja dengan benar.