Composer — dependensi & autoload
Composer bukan cuma pengunduh paket. Ia juga yang membuat satu baris use App\Models\User; berhasil menemukan filenya — tanpa satu pun require.
Intisari
composer.jsonmenyatakan kehendak;composer.lockmencatat versi persis yang terpasang.- Commit
composer.lock. Tanpa itu, produksi bisa memasang versi yang berbeda dari laptopmu. composer installmematuhi lock;composer updatemengubah lock. Di server, selalu yang pertama.- Autoload PSR-4 memetakan namespace ke folder — nama kelas dan nama file wajib sama persis, termasuk huruf besar-kecilnya.
- Di produksi:
--no-dev --optimize-autoloader. Ini bukan opsi kosmetik, dampaknya terukur.
Dua file, dua peran
| File | Isinya | Diedit oleh |
|---|---|---|
composer.json | Rentang versi yang kamu izinkan (^13.0) | Kamu / composer require |
composer.lock | Versi persis yang benar-benar terpasang, beserta hash | Composer — jangan disentuh tangan |
# menambah paket — menulis ulang composer.json DAN composer.lock
composer require laravel/sanctum
# hanya untuk pengembangan: tidak ikut ke produksi
composer require --dev pestphp/pest
# memasang persis seperti lock — ini yang dijalankan di server dan di CI
composer install
# menaikkan versi dalam batas yang diizinkan composer.json — mengubah lock
composer update
# naikkan satu paket saja, jangan seluruh dunia
composer update laravel/framework
Aturan yang menyelamatkan produksi: composer install di server, tidak pernah
composer update. install membaca composer.lock dan memasang versi yang
identik dengan yang kamu uji. update mengabaikan lock dan mengambil versi terbaru yang cocok —
artinya kode yang berjalan di produksi belum pernah dilihat siapa pun.
Membaca batasan versi
| Tulisan | Artinya | Contoh yang lolos |
|---|---|---|
^13.0 | ≥ 13.0, < 14.0 — yang paling umum | 13.0.1, 13.7.2 |
~13.1 | ≥ 13.1, < 14.0 | 13.4.0 |
~13.1.2 | ≥ 13.1.2, < 13.2.0 | 13.1.9 |
13.1.2 | Persis itu saja | 13.1.2 |
Laravel merilis versi mayor setiap tahun sekitar Q1, dengan janji tanpa breaking change di rilis minor
dan patch. Karena itu ^13.0 aman dijalankan otomatis, sementara lompatan ke ^14.0 adalah
keputusan sadar.
Autoload — bagian yang tidak ada di npm
Blok autoload di composer.json memetakan awalan namespace ke folder. Ini yang membuat
PHP tahu di mana mencari kelas yang belum pernah di-require:
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/"
}
}
Aturannya kaku, dan justru itu yang membuatnya bisa diandalkan:
| Kelas | Wajib ada di |
|---|---|
App\Models\User | app/Models/User.php |
App\Http\Controllers\OrderController | app/Http/Controllers/OrderController.php |
App\Services\Billing\Invoice | app/Services/Billing/Invoice.php |
Error "Class not found" hampir selalu salah satu dari tiga ini: namespace tidak cocok dengan folder,
huruf besar-kecil nama file berbeda (mematikan di Linux, tidak terasa di macOS), atau kamu baru menambah
folder baru dan perlu composer dump-autoload.
Perintah untuk produksi
composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist
| Flag | Efeknya |
|---|---|
--no-dev | Lewati Pest, Larastan, dan kawan-kawan. Image lebih kecil, permukaan serangan lebih sempit. |
--optimize-autoloader | Bangun peta kelas statis. Tanpa ini, tiap kelas dicari lewat operasi filesystem — terasa sekali di worker mode nanti. |
--no-interaction | Jangan pernah menunggu jawaban manusia di dalam pipeline. |
--prefer-dist | Ambil arsip, bukan clone git. Lebih cepat dan lebih kecil. |
Skrip: pintu masuk yang layak dipakai
Blok scripts berfungsi seperti npm run. Laravel sudah menyertakan composer run dev
yang menyalakan server, queue worker, dan Vite sekaligus:
composer run dev # server + queue listener + vite, satu perintah
composer run test # alias ke suite tes proyek
Latihan: di folder kosong, jalankan composer init, tambahkan pemetaan PSR-4
"App\\": "app/", buat app/Halo.php berisi kelas App\Halo, lalu panggil dari
index.php dengan require 'vendor/autoload.php' saja — tanpa require ke file
kelasnya. Setelah jalan, ganti nama filenya jadi halo.php huruf kecil dan amati apa yang terjadi.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.