Menu

Composer PHP: Cara Install Package dan Autoload Class

Composer adalah package manager untuk PHP: composer require vendor/package mengunduh library ke vendor/, mencatatnya di composer.json, lalu require 'vendor/autoload.php' memuatnya. Pelajari cara menginstal Composer, composer.json, batasan versi, install vs update, dan autoloading PSR-4 untuk class milikmu sendiri.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Composer adalah package manager untuk PHP. Jalankan composer require vendor/package di folder proyekmu: Composer mengunduh library itu ke vendor/, mencatatnya di composer.json, lalu kamu memuatnya, bersama semua yang sudah kamu instal, dengan satu baris, require __DIR__ . '/vendor/autoload.php';.

composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);

Tidak perlu include untuk setiap file: autoloader memuat Logger, StreamHandler, dan semua yang mereka pakai saat setiap class pertama kali dibutuhkan. Package diambil dari Packagist, registry publik yang dicari Composer secara bawaan.

Menginstal Composer

Composer butuh PHP di komputermu lebih dulu (lihat menginstal PHP).

Windows: unduh dan jalankan Composer-Setup.exe dari getcomposer.org. Installer ini menemukan php.exe milikmu dan menambahkan composer ke PATH. Setelah itu, buka terminal baru.

macOS dengan Homebrew:

brew install composer

Linux: paket dari distribusimu (sudo apt install composer di Debian dan Ubuntu) bisa dipakai, tetapi sering kali versinya lebih lama. Installer resmi memberikan versi terbaru:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

Halaman unduhan di getcomposer.org juga menampilkan satu baris yang memeriksa hash installer sebelum menjalankannya; salin perintahnya dari sana untuk mendapatkan hash terbaru. Lalu periksa apakah Composer sudah bekerja:

composer --version

composer.json dan composer.lock

composer init menanyakan beberapa hal lalu menulis composer.json, atau composer require membuatnya saat package pertama ditambahkan. Contoh yang umum:

{
    "name": "acme/shop",
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.0",
        "vlucas/phpdotenv": "^5.6"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
  • require berisi apa saja yang dibutuhkan proyek untuk berjalan, termasuk versi PHP.
  • require-dev berisi alat khusus untuk development (test, analisis statis). composer require --dev phpunit/phpunit menambah isinya, dan composer install --no-dev melewatinya di server production.
  • autoload memberi tahu Composer di mana class milikmu sendiri berada (lihat di bawah).

Di sebelahnya, Composer menulis composer.lock berisi versi persis dari setiap package yang diinstal, termasuk package yang dibutuhkan oleh package-package milikmu. Commit kedua file itu. Jangan commit vendor/: tambahkan ke .gitignore, karena composer install membangunnya ulang dari file lock.

composer install vs composer update

composer install          # install exactly what composer.lock says
composer update           # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog   # update one package only
composer remove monolog/monolog   # uninstall and remove from composer.json
composer outdated         # list packages with newer versions available

Jalankan composer install setelah clone proyek dan di setiap deploy: semua orang mendapatkan versi yang sama dengan yang sudah diuji. Jalankan composer update hanya saat kamu berniat upgrade, lalu uji dan commit composer.lock yang baru. Menjalankan update di server production akan menginstal versi yang belum diuji siapa pun.

Batasan versi: ^ dan ~

BatasanMengizinkanDipakai untuk
^3.23.2.0 sampai sebelum 4.0.0Pilihan normal: fitur dan perbaikan, tanpa versi mayor yang merusak
^0.40.4.0 sampai sebelum 0.5.0Package sebelum 1.0, yang versi minornya bisa merusak
~3.23.2.0 sampai sebelum 4.0.0Sama dengan ^3.2
~3.2.13.2.1 sampai sebelum 3.3.0Hanya perbaikan
3.2.1Tepat 3.2.1Jarang; ini menghalangi perbaikan keamanan
>=3.2 <3.5Rentang khususMenghindari rilis yang rusak

composer require vendor/package tanpa versi akan memilih rilis stabil terbaru dan menulis batasan ^ untuknya, dan biasanya itulah yang kamu mau.

Autoload class milikmu sendiri dengan PSR-4

PSR-4 adalah konvensi yang memetakan namespace ke sebuah folder: dengan "App\\": "src/", class App\Text\Slug berada di src/Text/Slug.php. Setelah menambahkan bagian autoload, jalankan:

composer dump-autoload

Autoloader Composer adalah fungsi yang didaftarkan dengan spl_autoload_register(), yang dipanggil PHP setiap kali kode memakai class yang belum dimuat. Blok ini menulis dua file class dan mendaftarkan autoloader PSR-4 kecil buatannya sendiri, jadi kamu bisa melihat pemetaannya bekerja. Tambahkan file class ketiga lalu pakai.

Autoloader berjalan sekali untuk setiap class: panggilan Slug::from() yang kedua tidak mencetak baris autoload:, karena class-nya sudah dimuat. Di proyek sungguhan, kamu tidak pernah menulis fungsi ini sendiri; vendor/autoload.php mendaftarkan versi milik Composer, yang juga menangani package di vendor/. Namespace dibahas di halaman namespace.

Error yang sering muncul

  • Class "Monolog\Logger" not found. Script tidak menjalankan require 'vendor/autoload.php', atau path-nya salah. Pakai __DIR__ . '/vendor/autoload.php' supaya path-nya tidak bergantung pada direktori saat ini.
  • Class milikmu sendiri tidak ditemukan setelah ditambahkan ke autoload. Jalankan composer dump-autoload, lalu periksa bahwa path file-nya cocok persis dengan namespace-nya, termasuk huruf besar dan kecil: App\Text\Slug harus berada di src/Text/Slug.php, dan server Linux menganggap src/text/slug.php sebagai file yang berbeda.
  • Your requirements could not be resolved to an installable set of packages. Dua package butuh versi yang tidak cocok dari sesuatu, sering kali PHP itu sendiri. Pesannya menyebutkan konfliknya; composer why-not vendor/package 2.0 menjelaskan apa yang menghalangi sebuah versi.
  • composer tidak dikenali. Terminal dibuka sebelum instalasi, atau folder-nya tidak ada di PATH. Buka terminal baru, atau panggil php composer.phar secara langsung.

Pertanyaan yang sering diajukan

Apa bedanya composer install dan composer update?

composer install menginstal versi yang persis tercatat di composer.lock, jadi setiap mesin mendapatkan kode yang sama; jalankan setelah clone dan saat deploy. composer update mencari versi terbaru yang diizinkan composer.json, menginstalnya, lalu menulis ulang composer.lock; jalankan saat kamu memang ingin upgrade.

Apakah composer.lock dan folder vendor perlu di-commit?

Commit composer.lock untuk aplikasi, supaya semua orang menginstal versi yang sama. Jangan commit vendor/: tambahkan ke .gitignore dan biarkan composer install membuatnya ulang.

Apa arti ^ di composer.json?

^2.3 mengizinkan versi mana pun dari 2.3.0 sampai sebelum 3.0.0: fitur baru dan perbaikan, tetapi tidak ada versi mayor baru yang bisa merusak kodemu. ~2.3 artinya sama, dan ~2.3.1 hanya mengizinkan 2.3.x mulai dari 2.3.1.

Bagaimana cara melakukan autoload class milikku sendiri dengan Composer?

Tambahkan "autoload": {"psr-4": {"App\\": "src/"}} ke composer.json, jalankan composer dump-autoload, lalu require 'vendor/autoload.php'. Class App\Mail\Mailer lalu dimuat dari src/Mail/Mailer.php saat pertama kali kamu memakainya.

Bagaimana cara mengecek versi Composer yang terinstal?

Jalankan composer --version. Untuk meng-upgrade Composer itu sendiri, jalankan composer self-update, atau upgrade lewat package manager yang kamu pakai untuk menginstalnya, misalnya brew upgrade composer.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai