Nafies Luthfi

Life will always feel wonderful if we always think positively.

Struktur Direktori Composer

Setelah minggu lalu kita membahas tentang perintah-perintah umum yang digunakan dalam Composer, kali ini kita akan bahas tentang struktur direktori project yang menggunakan Composer sebagai alat bantunya.

Dalam sebuah project yang menggunakan Composer, akan ada direktori dan file-file berikut :

  1. Direktori “vendor”
  2. File “vendor/autoload.php”
  3. File “composer.json”
  4. File “composer.lock”

Baik, kita bahas satu persatu sesuai yang saya pahami.

1. Direktori “vendor”

Sebagaimana yang telah kita singgung sebelumnya, direktori ini adalah tempat Composer meletakkan paket-paket yang telah diinstall/di-download-nya untuk project/aplikasi kita. Didalamnya terdapat:

  1. File autoload.php (ini akan kita bahas berikutnya)
  2. Direktori composer Saya tidak tahu persis isi dan fungsi dari direktori ini, tetapi sepertinya dari sini lah Composer mengatur agar kelas-kelas yang ada pada setiap paket dapat di akses sesuai dengan ”namespace”-nya. Karena secara umum paket-paket yang ada di Composer/packagist dibuat dalam basis object (OOP).
  3. Direktori-direktori lainnya yang merupakan direktori paket dependensi yang telah diinstall oleh Composer.

Nah, pada direktori-direktori ini, Composer mengatur susunan paket berdasarkan nama vendornya. Kita ambil contoh saat kita memberikan perintah

$ composer require nesbot/carbon 1.20.0

maka struktur direktori kita akan seperti gambar ini :

Struktur Direktori Composer 01

Kita fokus ke direktori "nesbot" dan "symfony" :

  • Direktori "nesbot" berisi direktori "carbon" yang berisi source code dari paket carbon sesuai yang ada di githubnya.
  • Kemudian direktori "symfony" berisi direktori "polyfill-mbstring" dan direktori "translation" di mana masing-masing berisi source code paket nya.

Ini sesuai dengan nama paketnya masing-masing yang telah terinstall pada contoh perintah composer require kita sebelumnya.

Composer Require 01

Kalau kita menggunakan perintah create-project kan paket yang di-download juga banyak ya, otomatis isi direktori vendor juga akan banyak.

Struktur Direktori Composer 02

Nah, jadi pada direktori “vendor” ini lah depedency kita “menginap”. Semakin banyak dependency di-download oleh Composer, maka semakin besar juga ukuran direktori ini. Direktori “vendor” ini wajib kita ikutkan kemana-mana pada saat aplikasi kita gunakan. Karena sesuai dengan yang kita bahas di sesi pertama “judulnya : perlu atau harus ada”.

Ada pertanyaan : “berarti kalau pakai Composer dan direktori vendor harus dibawa, aplikasi jadi besar dan berat donk?”
Jawabnya : “jadi besar? Iya. Jadi berat? Tidak”
“Kok tidak berat? Kan file yang dibawa banyak?”

“Karena Composer cukup pintar meng-efisien kan penggunaan autoload-nya agar kelas-kelas paket yang di-load oleh aplikasi, hanya kelas-kelas yang dibutuhkan saja.”

Saya belum tau persis cara kerjanya, tapi inilah jawaban yang saya simpulkan dari membaca beberapa referensi.

Composer membuat semacam classmap (peta kelas) untuk meng-efisien-kan penggunaan autoload-nya. Jadi file dan kelas paket hanya di-load ketika kelasnya dipanggil saja.

Contoh kasus : kita menggunakan paket shopping cart dan paket terbilang:

  • Kelas-kelas paket shopping cart akan diakses pada saat fitur shopping cart digunakan (misal halaman katalog dan halaman produk) dan tidak digunakan pada saat kita berada di halaman pengelolaan order.
  • kelas terbilang hanya akan digunakan pada saat fungsi/fitur terbilang digunakan/dipanggil, misal pada halaman Invoice Order. pada halaman lain kelas terbilang tidak akan di-load.

Mohon koreksi bila saya keliru paham tentang autoload ini.

Nah, bicara tentang autoload kelas, bagaimana caranya agar aplikasi yang kita buat dapat membaca dan mengenali kelas-kelas yang ada di masing-masing paket yang di download via Composer tadi? Kita langsung bahas file autoload.php di dalam direktori “vendor”

2. File “vendor/autoload.php”

File ini adalah file yang menghubungkan antara aplikasi kita dengan kelas-kelas yang di-download oleh Composer. File ini yang kita “require” ke dalam aplikasi php kita. Contohnya seperti gambar ini:

Struktur Direktori Composer 03

Jadi setelah file autoload.php ini kita require ke dalam aplikasi kita, maka kelas-kelas yang ada di direktori “vendor” dapat kita panggil berdasarkan “namespace”-nya.

Dari tadi saya sebut-sebut soal “namespace”, namespace itu apa sih? Hmm penjelasannya panjang teman-teman, saya juga belum benar-benar paham.

Intinya namespace itu untuk :

  1. Kita memanggil nama kelas yang sesuai fungsi paket yang kita panggil.
  2. Memastikan tidak konflik (dan pesan error) di aplikasi php kita akibat ada nama kelas (class) yang sama.

Artikel ini menjelaskan tentang namespace dengan “renyah”, mudah dicerna :)
http://id-laravel.com/post/mengenal-namespace-menjelajah-milyaran-galaksi, silakan kunjungi kalau ingin tahu tentang “namespace”.

Oke, kita simpulkan bahwa:

  1. direktori “vendor” tempat Composer meletakkan paket-paket depedency di aplikasi kita.
  2. file autoload.php di direktori “vendor” adalah “pintu gerbang” komunikasi antara aplikasi kita dengan paket-paket yang ada di dalam direktori “vendor”.

3. File “composer.json”

Baik kita lanjukan ke file composer.json File composer.json, adalah file yang dibuat oleh kita, atau oleh Composer untuk mencatat daftar paket yang “kita perlukan” untuk membuat project/aplikasi ini. Jadi pada file ini kita mencatat/menulis untuk menambahkan atau mengurangi paket yang menjadi dependency aplikasi kita. File composer.json yang terbentuk dari perintah composer require dengan composer create-project berbeda.

Sebagai contoh kita gunakan paket nesbot/carbon:

$ composer require nesbot/carbon 1.20.0

akan menghasilkan file composer.json seperti berikut ini :

Struktur Direktori Composer 04

Sedangkan pada perintah :

$ composer create-project nesbot/carbon project-saya 1.20.0

akan menghasilkan file composer.json persis seperti source codenya di github (sesuai versi yang kita pilih) :
https://github.com/briannesbitt/Carbon/blob/1.20.0/composer.json

4. File “composer.lock”

File composer.lock, adalah file yang dibuat oleh Composer untuk menyimpan detail paket-paket yang “telah” di-download ke dalam project/aplikasi kita. Untuk perintah :

$ composer require nesbot/carbon 1.20.0

kita akan dapatkan file composer.lock seperti berikut ini

https://gist.github.com/nafiesl/fc2ea0aa3acbcb0f41b2da3cfa01f20e

Kita lihat isi filenya, kita lihat pada :

  1. baris ke 10 merupakan nama dan versi paket “nesbot/carbon”,
  2. baris ke 57 merupakan nama dan versi paket “symfony/polyfill-mbsring”, dan
  3. baris ke 116 merupakan nama dan versi paket “symfony/translation”. Nah, dari isi file composer.lock inilah perintah composer install tanpa ba.. bi.. bu.. lagi akan langsung menginstall paket yang dibutuhkan.