# Modul Pembelajaran: PHP Composer & Autoloading

## Bagian 1: Pengenalan Dependency Management

### 1.1. Masalah: Dependency Hell
Sebelum adanya Composer, mengelola library pihak ketiga di PHP sangat merepotkan. Kita harus:
1.  Mencari website library.
2.  Mendownload file ZIP.
3.  Mengekstraknya ke folder project.
4.  Melakukan `require` atau `include` file library tersebut secara manual.

Masalah menjadi rumit ketika Library A membutuhkan Library B, dan Library B membutuhkan Library C. Kita harus mendownload semuanya secara manual dan memastikan versinya kompatibel. Ini disebut **Dependency Hell**.

### 1.2. Solusi: Composer
**Composer** adalah *Dependency Manager* untuk PHP. Ia bekerja dengan cara:
1.  Anda mendeklarasikan library apa yang dibutuhkan project Anda (di file `composer.json`).
2.  Composer akan otomatis mendownload library tersebut beserta semua dependensinya (library lain yang dibutuhkan).
3.  Composer menyediakan fitur **Autoloading** sehingga Anda tidak perlu melakukan `require` manual.

---

## Bagian 2: Instalasi & Penggunaan Dasar

### 2.1. Instalasi
Composer didistribusikan sebagai file `composer.phar`. Setelah diinstall, Anda bisa menjalankannya lewat terminal.
```bash
composer --version
```

### 2.2. Inisialisasi Project
Untuk memulai project baru dengan Composer:
```bash
mkdir project-baru
cd project-baru
composer init
```
Perintah ini akan memandu Anda membuat file `composer.json` secara interaktif.

### 2.3. Menambah Library
Gunakan perintah `require` untuk menambah library. Contoh menginstall `monolog/monolog` (library logging):
```bash
composer require monolog/monolog
```
Composer akan membuat folder `vendor/` dan mendownload library ke sana.

### 2.4. composer.json vs composer.lock
-   **composer.json**: Berisi daftar library yang *diinginkan* (misal: "versi 1.0 atau lebih baru").
-   **composer.lock**: Berisi daftar library yang *terinstall saat ini* dengan versi yang **sangat spesifik** (misal: "versi 1.0.2").

**PENTING**: Selalu commit `composer.lock` ke Git jika Anda membuat aplikasi, agar semua tim menggunakan versi library yang sama persis.

---

## Bagian 3: PSR-4 Autoloading

### 3.1. Apa itu Autoloading?
Autoloading adalah mekanisme PHP untuk memuat file class secara otomatis saat class tersebut dipanggil. Tanpa autoloading, kita harus menulis `require 'ClassA.php';` di setiap file.

### 3.2. Standar PSR-4
PSR-4 adalah standar yang menetapkan aturan pemetaan antara **Namespace** dan **Struktur Folder**.

Contoh konfigurasi di `composer.json`:
```json
{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
```
Artinya: Semua class yang berawalan namespace `App\` akan dicari di dalam folder `src/`.

-   Class `App\User` -> File `src/User.php`
-   Class `App\Controllers\HomeController` -> File `src/Controllers/HomeController.php`

### 3.3. Mengaktifkan Autoloading
Setelah mengubah konfigurasi autoload, jalankan:
```bash
composer dump-autoload
```

Di dalam kode PHP (biasanya di `index.php`), Anda hanya perlu memanggil satu file:
```php
require __DIR__ . '/vendor/autoload.php';

use App\User;

$user = new User(); // Otomatis dimuat!
```

---

## Bagian 4: Struktur Project Modern

Dengan Composer dan PSR-4, struktur project PHP modern biasanya terlihat seperti ini:

```
my-project/
├── src/                # Kode aplikasi Anda (Namespace App\)
│   ├── Controllers/
│   ├── Models/
│   └── User.php
├── vendor/             # Library pihak ketiga (JANGAN DIEDIT)
├── public/             # Folder yang bisa diakses publik (Web Root)
│   └── index.php       # Entry point
├── composer.json       # Konfigurasi dependensi
├── composer.lock       # Lock file versi
└── .gitignore          # Git ignore (masukkan /vendor di sini)
```

### Tips Penting
1.  **Jangan edit folder vendor**: Perubahan Anda akan tertimpa saat update.
2.  **Gunakan .gitignore**: Jangan commit folder `vendor/` ke Git. Cukup commit `composer.json` dan `composer.lock`. Orang lain tinggal menjalankan `composer install` untuk mendapatkan folder vendor yang sama.
3.  **Semantic Versioning**: Pahami arti `^1.0` (Update aman) dan `~1.0` (Update patch).

---

## Bagian 5: Script & Dev Dependencies

### 5.1. Dev Dependencies
Library yang hanya dibutuhkan saat development (seperti PHPUnit untuk testing) sebaiknya diinstall dengan flag `--dev`.
```bash
composer require --dev phpunit/phpunit
```

### 5.2. Scripts
Anda bisa membuat shortcut perintah di `composer.json`.
```json
"scripts": {
    "start": "php -S localhost:8000 -t public",
    "test": "phpunit"
}
```
Jalankan dengan `composer start` atau `composer test`.
