Autoloader PSR-4 yang kita rakit secara manual pada chapter sebelumnya membuktikan bahwa spesifikasinya sederhana — tetapi versi produksi butuh penanganan cache, prefix bertingkat, dan integrasi ribuan paket sekaligus. Di sinilah Composer masuk: selain manajer paket, Composer juga merupakan penyedia autoloader standar yang dipakai hampir seluruh ekosistem PHP modern. Alih-alih menulis autoloader sendiri, kita cukup mendeklarasikan pemetaan namespace di composer.json, menjalankan satu perintah, lalu me-require satu berkas: vendor/autoload.php. Pada chapter ini kita bangun proyek mini sungguhan dari nol dan amati apa yang Composer hasilkan di balik layar.

Deklarasi Autoload di composer.json #

Seluruh konfigurasi autoloading berada di bawah kunci autoload pada berkas composer.json. Untuk strategi PSR-4, setiap entri di dalam psr-4 memetakan satu prefix namespace ke satu direktori dasar — persis konsep prefix yang sudah kita kenal:

json
{
    "name": "toko/app",
    "description": "Aplikasi toko untuk demo autoloading",
    "require": {
        "php": ">=8.1"
    },
    "autoload": {
        "psr-4": {
            "Toko\\": "src/"
        }
    }
}

Perhatikan bahwa prefix ditulis sebagai "Toko\\" dengan dua backslash — JSON memakai backslash sebagai karakter escape, sehingga backslash sungguhan harus digandakan. Dengan deklarasi ini, class Toko\Pembayaran\Faktur akan dicari di src/Pembayaran/Faktur.php tanpa konfigurasi tambahan apa pun.

Membangun Proyek Mini #

Mari kita wujudkan proyek kecil berikut ini, lalu jalankan Composer di dalamnya:

text
toko-app/
├── composer.json
├── jalan.php
└── src/
    └── Pembayaran/
        └── Faktur.php

Berkas class-nya sederhana — satu class satu berkas, namespace mengikuti struktur direktori:

php
<?php

namespace Toko\Pembayaran;

class Faktur
{
    public function __construct(
        private string $nomor,
        private int $total,
    ) {}

    public function ringkas(): string
    {
        return "Faktur {$this->nomor}: Rp{$this->total}";
    }
}

Skrip jalan.php menjadi pintu masuk program. Satu-satunya hal yang perlu ia lakukan untuk mengaktifkan seluruh autoloading proyek adalah me-require vendor/autoload.php:

php
<?php

require __DIR__ . '/vendor/autoload.php';

use Toko\Pembayaran\Faktur;

$faktur = new Faktur('FP-001', 250000);
echo $faktur->ringkas(), "\n";

Sekarang kita generate autoloader-nya. Dari dalam direktori toko-app, jalankan composer install:

bash
composer install

Output yang Dihasilkan:

text
Composer could not detect the root package (toko/app) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Writing lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files

Folder vendor/ kini berisi mesin autoloading Composer:

text
vendor/
├── autoload.php
└── composer/
    ├── ClassLoader.php
    ├── InstalledVersions.php
    ├── autoload_classmap.php
    ├── autoload_files.php
    ├── autoload_namespaces.php
    ├── autoload_psr4.php
    ├── autoload_real.php
    ├── autoload_static.php
    ├── installed.json
    ├── installed.php
    └── platform_check.php

Berkas vendor/autoload.php adalah satu-satunya yang perlu di-require program Anda; berkas-berkas lain dimuat olehnya secara berantai. Saat skrip jalan.php dijalankan, class Faktur termuat otomatis tanpa satu pun require manual:

bash
php jalan.php

Output yang Dihasilkan:

text
Faktur FP-001: Rp250000

Apa yang Di Balik vendor/autoload.php #

Rasa penasaran kita bisa dibayar dengan membuka isi vendor/composer/autoload_psr4.php — berhasil generate dari deklarasi "psr-4" di composer.json:

php
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Toko\\' => array($baseDir . '/src'),
);

Berkas ini hanyalah tabel pemetaan prefix ke direktori — format yang sama dengan properti $peta pada autoloader manual kita di chapter PSR-4. Yang memakai tabel tersebut adalah class Composer\ClassLoader di vendor/composer/ClassLoader.php: saat di-require, vendor/autoload.php membuat instance ClassLoader, mengisi tabel-tabelnya, lalu mendaftarkannya ke antrean SPL lewat spl_autoload_register(). Jadi tidak ada sihir: seluruh mesin ini berdiri di atas mekanisme yang sudah kita pelajari.

Empat Strategi Autoload Composer #

Kunci autoload mengenal empat strategi. Kita sudah memakai psr-4; tiga lainnya melayani kebutuhan khusus:

StrategiBentuk nilaiCocok untuk
psr-4objek prefix → direktorikode modern dengan namespace; standar utama
classmaparray direktori/berkaskode lama yang strukturnya tidak mengikuti PSR-4
filesarray berkasfungsi global helper yang perlu selalu termuat
psr-0objek prefix → direktoripaket legacy era PHP 5; kompatibilitas mundur saja

Strategi files menjawab satu celah yang tidak dijangkau PSR-4: autoloading hanya bekerja untuk class, interface, trait, dan enum — bukan fungsi global. Bila proyek menyediakan fungsi helper seperti formatRupiah(), berkasnya harus didaftarkan agar ikut ter-require setiap kali vendor/autoload.php dimuat:

json
{
    "name": "toko/app",
    "description": "Aplikasi toko untuk demo autoloading",
    "require": {
        "php": ">=8.1"
    },
    "autoload": {
        "psr-4": {
            "Toko\\": "src/"
        },
        "files": [
            "src/Fungsi/bantuan.php"
        ]
    }
}

Berkas src/Fungsi/bantuan.php berisi fungsi tanpa namespace:

php
<?php

function formatRupiah(int $angka): string
{
    return 'Rp' . number_format($angka, 0, ',', '.');
}

Setiap perubahan pada kunci autoload harus diikuti regenerasi autoloader dengan perintah composer dump-autoload:

bash
composer dump-autoload

Output yang Dihasilkan:

text
Composer could not detect the root package (toko/app) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
Generating autoload files
Generated autoload files

Sekarang fungsi helper tersedia begitu vendor/autoload.php di-require:

bash
php jalan.php

Output yang Dihasilkan:

text
Faktur FP-001: Rp250000
Rp1.500.000

Baris kedua keluar dari formatRupiah(1500000) — bukti berkas bantuan.php ikut termuat otomatis. Untuk menguji strategi classmap dan psr-0 secara mendalam, Anda bisa lanjut ke Section Composer dan Dependency Management yang membahas composer.json secara penuh.

dump-autoload dan Mode Optimasi #

Secara bawaan, ClassLoader menyelesaikan jalur PSR-4 saat runtime: setiap class yang belum termuat diperiksa ke tabel prefix, lalu ke sistem berkas. Mode ini fleksibel untuk pengembangan karena class baru langsung ditemukan tanpa perintah tambahan, tetapi di server produksi pemeriksaan berkas berulang menambah biaya kecil pada setiap request.

Perintah composer dump-autoload -o (kependekan dari --optimize) membangkitkan classmap: Composer memindai seluruh berkas PHP yang tercakup konfigurasi, lalu menulis tabel lengkap nama class ke jalur berkas:

bash
composer dump-autoload -o

Output yang Dihasilkan:

text
Composer could not detect the root package (toko/app) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
Generating optimized autoload files
Generated optimized autoload files containing 2 classes

Hasil pemindaian tersimpan di vendor/composer/autoload_classmap.php:

php
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'Toko\\Pembayaran\\Faktur' => $baseDir . '/src/Pembayaran/Faktur.php',
);

Dengan classmap, mencari class Toko\Pembayaran\Faktur tinggal satu lihat ke tabel — tidak ada lagi perhitungan prefix dan pemeriksaan direktori. Angka containing 2 classes menghitung class milik proyek kita ditambah class internal Composer.

Ringkasan #

Composer mengambil alih seluruh pekerjaan autoloading: deklarasi psr-4 di composer.json menggantikan autoloader tulisan tangan, composer install atau composer dump-autoload menghasilkan mesinnya, dan satu baris require 'vendor/autoload.php' mengaktifkannya lewat antrean SPL yang sudah kita pahami. Strategi files melengkapi PSR-4 untuk fungsi global, sementara classmap hasil dump-autoload -o mempercepat resolusi di produksi. Dengan mesin ini di tangan, pertanyaan berikutnya bukan lagi bagaimana memuat class, melainkan bagaimana merancang struktur namespace agar proyek tetap sehat saat membesar — topik chapter penutup section ini.

Referensi #