← Semua pembelajaran / Laravel Nol → Enterprise
Fase 0 · Fondasi PHP & Tooling

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.

Sumber asli getcomposer.org Resmi Rangkuman ~6 menit baca

Intisari

  • composer.json menyatakan kehendak; composer.lock mencatat versi persis yang terpasang.
  • Commit composer.lock. Tanpa itu, produksi bisa memasang versi yang berbeda dari laptopmu.
  • composer install mematuhi lock; composer update mengubah 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

FileIsinyaDiedit oleh
composer.jsonRentang versi yang kamu izinkan (^13.0)Kamu / composer require
composer.lockVersi persis yang benar-benar terpasang, beserta hashComposer — 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

TulisanArtinyaContoh yang lolos
^13.0≥ 13.0, < 14.0 — yang paling umum13.0.1, 13.7.2
~13.1≥ 13.1, < 14.013.4.0
~13.1.2≥ 13.1.2, < 13.2.013.1.9
13.1.2Persis itu saja13.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:

KelasWajib ada di
App\Models\Userapp/Models/User.php
App\Http\Controllers\OrderControllerapp/Http/Controllers/OrderController.php
App\Services\Billing\Invoiceapp/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
FlagEfeknya
--no-devLewati Pest, Larastan, dan kawan-kawan. Image lebih kecil, permukaan serangan lebih sempit.
--optimize-autoloaderBangun peta kelas statis. Tanpa ini, tiap kelas dicari lewat operasi filesystem — terasa sekali di worker mode nanti.
--no-interactionJangan pernah menunggu jawaban manusia di dalam pipeline.
--prefer-distAmbil 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.