Menyelami Framework Laravel Panduan komprehensif untuk menguasai framework Laravel. Rahmat Awaludin ©2014 Rahmat Awaludin
Tweet This Book! Please help Rahmat Awaludin by spreading the word about this book on Twitter! The suggested hashtag for this book is #bukularavel. Find out what other people are saying about the book by clicking on this link to search for this hashtag on Twitter: https://twitter.com/search?q=#bukularavel
Also By Rahmat Awaludin Seminggu Belajar Laravel
Untuk istriku tercinta, Irna Rahayu dan jagoan kecilku, Shidqi Abdullah Mubarak.
Contents Konsep Dasar . . . . . . . . . . . . . . . . . . . . JSON . . . . . . . . . . . . . . . . . . . . . . . . PHP5 Anonymous Function/Lambda & Closure . PHP5 Autoloader . . . . . . . . . . . . . . . . . PHP5 Abstract dan Interfaces . . . . . . . . . . . PHP5 Namespace . . . . . . . . . . . . . . . . . PHP5 Traits . . . . . . . . . . . . . . . . . . . . PHP5 Reflection . . . . . . . . . . . . . . . . . . Composer . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
1 1 2 7 11 23 23 23 23
Konsep Dasar Oke bro, saya yakin udah ngga sabar mau belajar Laravel. Udah tau kan, katanya Laravel itu framework PHP yang lagi booming¹? Tapi, tenang dulu, saya ingin agar pemahaman kita tentang framework ini lengkap banget. Bab ini, sengaja saya selipkan untuk membahas topik-topik “dasar” (sebenarnya ngga dasar banget sih) yang perlu dipahami sebelum mempelajari framework Laravel. Supaya nanti tidak tenggelam dalam lautan kebingungan ketika pembahasan tentang Laravel sudah sangaaaaat dalam.
Peringatan Sebagian materi di bab ini bukan untuk Anda yang baru mengenal PHP. Jika Anda mengalami gejala pusing dan mual-mual setelah membaca materi di bab ini, silahkan pelajari kembali dasar-dasar PHP Procedural dan OOP.
JSON JSON (dilafalkan “Jason”), singkatan dari JavaScript Object Notation (bahasa Indonesia: notasi objek JavaScript), adalah suatu format ringkas pertukaran data komputer. Itu. Ngerti kan? Oke, oke, becanda. :D Saya jelaskan lebih detail ya, JSON itu format data yang digunakan untuk bertukar data antar bahasa pemrograman. Awalnya JSON ini hanya digunakan di Javascript. Tapi, seiring waktu, JSON juga digunakan oleh bahasa pemrograman yang lain. Syntax dasar JSON kayak gini: Contoh JSON
1 2 3 4 5 6 7
{ key1 : value1, key2 : { key3 : value3, key4 : value4 } } ¹www.sitepoint.com/best-php-frameworks-2014
2
Konsep Dasar
JSON mendukung berbagai format data, yaitu : • • • •
Number : berisi bilangan bulat atau desimal. String : teks yang diapit tanda petik. Boolean : Isian benar (true) atau salah (false). Array : Data terurut yang diapit [ ] dan dibatasi koma. Larik bisa berisi gabungan tipe data yang lain. • Object : Data tidak terurut yang diapit { } dan dibatasi koma. Setiap elemen object berisi key dan value dibatasi :. • null : nilai kosong, diisi dengan keyword null. Jika digabungkan, semua tipe data diatas jadi seperti ini: Contoh JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "nomor_antrian" : 20, "nama" : "Firman", "menikah" : false, "hobi" : ["memancing", "berenang", "bersepeda"], "alamat" : { "jalan" : "Pakuan No. 12", "kota" : "Bandung", "provinsi" : "Jawa Barat", "kode_pos" : "43655" }, "telpon" : { { "jenis" : "rumah", "nomor" : "022-345352" }, { "jenis" : "mobile", "nomor" : "0878-23422321" } }, "istri" : null }
JSON akan sangat sering kita temui dalam pengembangan web dengan Laravel. Oleh karena itu, pastikan Anda paham tentang JSON ini. Kalau belum paham, ngga apa-apa juga sih, ntar juga paham kalau sudah praktek. Sip.
PHP5 Anonymous Function/Lambda & Closure Sebagaimana seorang hacker yang tidak ingin diketahui namanya, begitu pula dengan Anonymous Function/Lambda ini. Fitur PHP ini, memungkinkan kita membuat fungsi tanpa menghabiskan
3
Konsep Dasar
ruang memori. Karena fungsi yang dibuat secara anonymous tidak akan menambah jumlah fungsi pada class yang ada. Jadi, kalau dari segi kesolehan, fungsi ini termasuk tipe tawadhu (rendah hati) karena ia banyak bekerja tanpa ingin diketahui namanya. Hadeuuhhh.. :v Perhatikan contoh syntax berikut: ∼/sites/lambda-anonymous-closure-sip/index.php
1 2 3 4 5 6 7 8 9 10
Yang syntax ini lakukan adalah membuat dua buat fungsi yaitu namaAnda() yang menampilkan nama yang Anda inginkan dan bisa() yang menampilkan tulisan motivasi mempelajari framework Laravel. Fungsi bisa() menerima parameter sebuah string yang kita beri nama $nama. Pada baris terakhir, kita memanggil fungsi bisa() dengan parameter output dari fungsi namaAnda(). Tentunya ini bisa dilakukan, karena output dari fungsi namaAnda() adalah string. Sehingga output nya menjadi:
Menggunakan fungsi sebagai paramater
Jika membuat fungsi biasa harus pakai nama misal: function namaAnda() { return "Rahmat Awaludin"; }
maka, Anonymous Function ditulis dengan menghilangkan nama fungsinya:
4
Konsep Dasar
function() { return "Rahmat Awaludin"; }
Untuk menggunakan anonymous function ini, kita mempassing fungsi tersebut ke sebuah variable. Berikut ini contoh kalau saya mengubah fungsi namaAnda() menjadi anonymous function dan menyimpannya ke variable $nama: ∼/sites/lambda-anonymous-closure-sip/index.php
1 2 3 4 5 6 7 8 9 10
Coba jalankan lagi, hasilnya tetap sama kan?
Anonymous function sedang beraksi
Kalau udah paham, sekarang kita pelajari tentang Closure. Closure mirip-mirip dengan lambda/anonymous function, bedanya closure ini dapat menerima parameter dan mengakses variable dari luar fungsi itu. Misal kayak gini:
5
Konsep Dasar
∼/sites/lambda-anonymous-closure-sip/closure.php
1 2 3 4 5 6 7 8 9 10 11 12 13
Pada file ini saya membuat fungsi namaAnda() yang menerima input title dan nama kemudian menampilkan output title dan nama. Saya juga membuat fungsi bisa() yang menerima input string dan menampilkan output kalimat motivasi. Di baris terakhir, saya memanggil fungsi bisa() dengan parameter output dari fungsi namaAnda(). Outputnya seperti ini:
Fungsi biasa dengan parameter
Jika kita merubah fungsi namaAnda() menjadi closure, maka syntaxnya akan berubah menjadi : ∼/sites/lambda-anonymous-closure-sip/closure.php
1 2 3 4 5 6 7 8 9 10 11
6
Konsep Dasar
12 13
bisa($nama());
Terlihat disini, untuk menggunakan variable diluar closure (dalam contoh ini variable $title dan $nama), kita menggunakan keyword use. Outputnya akan tetap sama:
Menggunakan closure
Closure ini biasanya digunakan pada fungsi yang menggunakan callback sebagai parameternya. Apaan tuh callback? callback adalah parameter berupa fungsi. Contohnya seperti fungsi array_walk² (bawaan PHP). Fungsi ini akan mengiterasi (mirip foreach) elemen dari suatu array. Parameter pertama dari fungsi ini adalah array dan parameter keduanya harus berupa callback. Nah, callback inilah closure. Perhatikan syntax berikut (boleh sambil dicoba): ∼/sites/lambda-anonymous-closure-sip/closure-as-callback.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
"Agus", ["nama"=>"Deni", ["nama"=>"Budi", ["nama"=>"Bayu",
"nilai"=>90], "nilai"=>80], "nilai"=>40], "nilai"=>75],
]; array_walk($dataNilai, function($siswa) use ($minimal) { echo "Siswa : " . $siswa['nama'] . "\n"; echo "Nilai : " . $siswa['nilai'] . "\n"; echo "Status : "; if ($siswa['nilai'] >= $minimal) { echo "Lulus\n\n"; } else { echo "Tidak Lulus\n\n"; ²http://php.net/manual/en/function.array-walk.php
7
Konsep Dasar
18 19
} });
Syntax ini akan menggunakan fungsi array_walk untuk melooping semua element dari array $dataNilai. Pada parameter kedua di fungsi array_walk kita menggunakan closure untuk memproses setiap elemen array agar menampilkan detail nama, nilai dan status kelulusan siswa berdasarkan variabel $minimal yang kita buat sebelumnya. Berikut ini output dari syntax berikut:
Closure sebagai callback
Demikian penjelasan tentang Lambda dan Closure, saya harap Anda dapat memahaminya. Karena, fitur ini akan sering kita gunakan pada pembahasan di bab-bab selanjutnya. Source code dari latihan ini bisa didapat di https://github.com/rahmatawaludin/lambdaanonymous-closure-sip³
PHP5 Autoloader Jika Anda seorang veteran di pemrograman PHP (ehm), tentu sudah sangat familiar dengan syntax include untuk memasukkan syntax dari file lain ke file yang sedang aktif. Biasanya, syntax ini digunakan jika Anda hendak menggunakan class yang berada pada file yang lain. Perhatikan contoh syntax berikut: ³https://github.com/rahmatawaludin/lambda-anonymous-closure-sip/commits/master
8
Konsep Dasar
∼/sites/autoloader-oh-autoloader/Printer.php
1 2 3 4 5 6 7 8
∼/sites/autoloader-oh-autoloader/Kurir.php
1 2 3 4 5 6 7
∼/sites/autoloader-oh-autoloader/index.php
1 2 3 4 5 6 7 8
cetakBuku('Menyelami Framework Laravel'); include 'Kurir.php'; $kurir = new Kurir(); $kurir->kirim($buku, 'Bandung');
Pada syntax ini, terlihat kita memiliki dua buah class yaitu Printer dan Kurir. Pada Class Printer, terdapat method cetakBuku() yang berfungsi menampilkan tulisan “Mencetak Buku “ dengan nama buku yang menjadi parameter. Ketika kita mengambil method ini, kita juga memanggil nama Class yang aktif dengan syntax echo "Class " . __CLASS__ . " : ". Pada Class Kurir, terdapat method kirim() yang berfungsi menampilkan tulisan “Mengirim $file ke $tujuan” dengan $file dan $tujuan merupakan parameter dari method ini. Kita juga menampilkan nama Class yang aktif ketika memanggil method ini.
9
Konsep Dasar
Perhatikan file index.php. Di baris ke-2 dan ke-6 saya menggunakan syntax include untuk memasukan file Printer.php dan Kurir.php. Ini merupakan cara lama agar saya dapat membuat object dari class Printer dan Kurir yang berada di kedua file tersebut. Syntax selanjutnya adalah syntax biasa untuk membuat object Printer dan Kurir kemudian memanggil method pada masing-masing object tersebut. Output dari syntax ini seperti ini:
Tanpa Autoloader
Sip. Seperti yang Anda lihat, syntax ini berjalan sebagaimana mestinya. Dan cara inilah yang sering digunakan dari dulu (bahkan sampai sekarang masih dipakai di Wordpress) untuk memanggil Class dari file yang berbeda. Cara ini, meskipun dapat digunakan, tetapi kurang efektif. Bayangkan, jika Anda memiliki 100 Class di 100 file yang berbeda, apakah Anda mau membuat 100 statement include?
Tentu tidak. Dan para pendahulu kita yang telah lebih dulu memahami PHP pun memikirkan hal tersebut. Maka, lahirlah fitur autoloader di PHP. Dengan fitur ini, Anda tidak perlu menulis include untuk setiap file PHP yang akan di masukkan ke file. Untuk menggunakan autoloader kita akan menggunakan fungsi spl_autoload_register()⁴. Fungsi ini menerima parameter closure/fungsi yang memiliki sebuah parameter $class yang berisi nama class yang akan dipanggil. Di dalam closure ini, kita melakukan include ke class yang diinginkan. Mari kita praktekan, saya akan rubah file index.php menjadi :
⁴http://php.net/manual/en/function.spl-autoload-register.php
10
Konsep Dasar
∼/sites/autoloader-oh-autoloader/index.php
1 2 3 4 5 6 7 8 9 10
cetakBuku('Menyelami Framework Laravel'); $kurir = new Kurir(); $kurir->kirim($buku, 'Bandung');
Pada perubahan ini saya menghapus dua statement include dan menambahkan syntax: ∼/sites/autoloader-oh-autoloader/index.php
1 2 3 4
Yang dilakukan syntax ini adalah melakukan include setiap kali saya melakukan new Class(). Terlihat di baris ke-3, saya menggunakan include $class . '.php';. Ketika code berjalan (runtime), misalnya saya memanggil new Printer(), maka syntax ini akan berubah menjadi include Printer.php; yang akan memasukkan konten file tersebut ke code yang sedang aktif. Itulah alasan saya membuat sebuah file untuk sebuah class. Dengan cara ini, Anda tidak perlu lagi melakukan include manual untuk tiap Class yang dibutuhkan. Keren kan? Kalau dijalankan, outputnya akan tetap sama.
Setelah Autoloader
Tentunya, autoloader ini dapat disesuaikan dengan kebutuhan Anda. Misalnya, semua class berada di folder class dan berakhiran .inc.php, maka syntax autoloader berubah menjadi :
11
Konsep Dasar
Merubah autoloader
1 2 3 4
Laravel sangat aktif menggunakan Autoloader ini. Dengan memahami dasar dari Autoloader ini, mudah-mudahan Anda tidak tenggelam dalam kebingungan ketika pembahasan tentang Laravel semakin dalam. Sip. Source code dari latihan ini bisa didapat di https://github.com/rahmatawaludin/autoloaderoh-autoloader⁵
PHP5 Abstract dan Interfaces Memahami Abstract dan Interfaces sangat penting untuk dapat mendalami framework Laravel. Saya yakin, dalam mempelajari mempelajari OOP di PHP, Anda pasti telah memahami Class dan Inheritance. Jika Class dan Inheritance adalah nasi dan sayur asem, maka Abstract dan Interfaces adalah ikan asin dan sambelnya. Nah. :D
Abstract Oke. Kita mulai dari Abstract. Apa itu Abstract? Abstrak adalah tipe yang tidak dapat dipakai secara langsung. (Wikipedia) Maksudnya, Abstract itu adalah semacam class di PHP tapi tidak bisa langsung dibuat objectnya. Misalnya, sebuah tombol. Kita semua pasti tahu, bahwa tombol apapun pasti bisa ditekan. Hanya saja, tiap tindakan yang terjadi ketika kita menekan tombol akan berbeda, tergantung jenis tombolnya. Perhatikan contoh ini:
⁵https://github.com/rahmatawaludin/autoloader-oh-autoloader/commits/master
12
Konsep Dasar
∼/sites/abstract-wal-interfaces/Tombol.php
1 2 3 4
∼/sites/abstract-wal-interfaces/contoh-abstract-gagal.php
1 2 3 4
tekan();
Terlihat disini, saya langsung mencoba membuat object (instantiate) dari abstract class Tombol. Maka, akan ada error seperti ini:
Class Abstract tidak bisa langsung dibuat object
Ini menunjukkan bahwa abstract tidak bisa langsung di-instantiate menjadi object. Untuk membuat object, kita perlu membuat class baru yang merupakan turunan dari abstract class Tombol ini. Perhatikan syntax ini: ∼/sites/abstract-wal-interfaces/TombolLogin.php
1 2 3 4 5
13
Konsep Dasar
∼/sites/abstract-wal-interfaces/contoh-abstract-sukses.php
1 2 3 4
tekan();
Disini kita membuat class baru bernama TombolLogin yang meng-extend abstract class Tombol. Kalau kita jalankan :
Gagal meng-extends interface, karena ada method yang belum diimplementasikan
Uuuppss… Dia error lagi. Ini terjadi karena, kita belum mengimplementasikan method abstract yaitu method tekan() yang ada di abstract class Tombol. Mari kita perbaiki: ∼/sites/abstract-wal-interfaces/TombolLogin.php
1 2 3 4 5 6 7 8 9
Kalau kita jalankan lagi:
14
Konsep Dasar
Berhasil menggunakan abstract class Tombol
Tuhh.. dia berhasil kan? :) Ini penting. Jadi, abstract itu sangat berguna kalau kita ingin memastikan bahwa suatu method selalu tersedia pada class, apapun implementasinya. Dalam contoh ini, kita selalu bisa memanggil method tekan() apapun jenis tombolnya. Biar lebih paham, saya tambah lagi contohnya. Kali ini, ceritanya saya mau bikin tombol untuk meluncurkan bom nuklir. Perlu dicatat, ini hanya contoh, tidak ada yang dilukai dalam pembuatan contoh ini. Perhatikan syntax ini: 1 2 3 4 5 6 7 8 9
∼/sites/abstract-wal-interfaces/TombolNuklir.php
Untuk menjalankan tombol ini, kita tetap menggunakan method yang sama, yaitu tekan(): 1 2 3 4
∼/sites/abstract-wal-interfaces/contoh-abstract-sukses-2.php tekan();
Kalau dijalankan..
Berhasil membuat Tombol Nuklir
15
Konsep Dasar
Boooooommmmm!!! Oke, saya rasa sudah cukup penjelasannya. Pertanyaanya, kapan biasanya teknik abstract class ini digunakan? Contohnya banyak, salah satunya saya contohkan dengan dependency injection. Teknik ini memudahkan kita untuk memasukkan (inject) class yang kita butuhkan pada class yang sedang digunakan. Contoh dependency injection, misalnya seorang Pembeli harus punya kartu BNI untuk melakukan pembayaran. Bisa kita implementasikan dengan meng-inject class BNI ke class Pembeli. Seperti ini: ∼/sites/abstract-wal-interfaces/BNI.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
private function catatTransaksi($jenis, $jumlah) { echo "Mencatat transaksi $jenis sejumlah $jumlah ke Buku Tabungan. } public function kredit($jumlah) { $this->catatTransaksi('transfer keluar', $jumlah); $this->saldo -= $jumlah; } public function deposit($jumlah) { $this->catatTransaksi('deposit dana', $jumlah); $this->saldo += $jumlah; } public function cekSaldo() { return $this->saldo;
16
Konsep Dasar
33 34
} }
Class BNI ini mempunyai: • attribute $saldo yang berfungsi mencatat saldo terakhir. • method __construct() yang berfungsi membangun object BNI, di method ini kita mengharuskan input PIN. Dalam prakteknya, tentu saja PIN ini disimpan di database, tapi disini kita sederhanakan dengan menyimpannya langsung di method ini. • method kredit() yang berfungsi untuk mengurangi jumlah saldo. • method deposit() yang berfungsi untuk menambah jumlah saldo. • method cekSaldo() yang berfungsi mengecek jumlah saldo terkini. Mari kita buat class Pembeli, Class ini akan membutuhkan class BNI : ∼/sites/abstract-wal-interfaces/Pembeli-DI.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
bni = $bni; $this->nama = $nama; } public function beli($nama = "Barang", $harga = 0) { $this->bni->kredit($harga); echo "Berhasil melakukan pembelian $nama seharga Rp$harga.\n"; echo "Terima kasih $this->nama :)\n"; } }
Class Pembeli ini mempunyai : • • • •
atribut $nama untuk menyimpan nama pembeli atribut $bni untuk menyimpan object kartu BNI method beli() untuk melakukan pembelian barang method __construct() untuk membangun object Pembeli
Yang paling penting untuk diperhatikan disini adalah method __construct(). Di method ini kita menginject class BNI sebagai parameternya. Kalau didemokan syntaxnya seperti ini:
17
Konsep Dasar
1 2 3 4 5 6 7 8 9 10 11 12
∼/sites/abstract-wal-interfaces/Pembeli-DI.php deposit(20000000); $rudy = new Pembeli("Rudy", $bniKu); $rudy->beli("Buku Menyelami Framework Laravel", 250000); echo "Saldo terakhir Rp".$bniKu->cekSaldo()."\n"; } catch (Exception $e) { echo $e->getMessage()."\n"; }
Terlihat disini, sebelum membuat object Pembeli, saya membuat object BNI dulu. Kemudian menginject object BNI itu ketika membuat object Pembeli. Jika dijalankan, hasilnya seperti berikut :
Berhasil meng-inject BNI ke Pembeli
Masalah dari dependency injection ini adalah bagaimana bila kita akan menggunakan metode pembayaran lain? Misalnya, Paypal. Tentunya, cara mengakses paypal ini pun akan berbeda dengan BNI, karena Paypal harus login dengan email dan password. Begitupun cara paypal melakukan kredit dan deposit, karena paypal perlu mengirim email setiap kali terjadi transaksi. Kalau gitu langsung di extends dari class BNI saja gimana mas? Memang, sekiranya implementasinya akan sama, kita cukup meng-extends class Paypal dari BNI. Namun, karena implementasi dari method kredit() dan deposit() ini bisa berbeda, maka fitur pembayaran ini cocok untuk di-abstraksi. Dengan abstraksi pula, akan lebih memudahkan jika akan ada implementasi jenis pembayaran yang baru, misalnya BitCoin. Kita bisa membuat abstraksi dengan membuat class abstract yang berisi method apa saja yang harus ada di Class tersebut yang akan digunakan di class Pembeli. Tahapannya dimulai dari class Pembeli, ubah menjadi :
18
Konsep Dasar
∼/sites/abstract-wal-interfaces/Pembeli.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
nama = $nama; $this->payment = $payment; }
public function beli($nama = "Barang", $harga = 0) { if ($this->payment->cekSaldo() < $harga) { echo "Uang tidak cukup\n"; } else { $this->payment->kredit($harga); echo "Terima kasih $this->nama :)\n"; echo "Berhasil melakukan pembelian $nama seharga R } } }
Perubahan terbesar dari class Pembeli adalah saya mengubah atribut $bni menjadi $payment dan mengubah mengabstraksi class BNI menjadi PaymentMethod. Terlihat disini, class PaymentMethod perlu menambahkan beberapa method: • cekSaldo() untuk mengecek saldo terakhir • kredit() untuk mengambil sejumlah uang • deposit() untuk mengisi sejumlah uang Untuk memudahkan pengecekan, saya akan menambah method cekNamaPembayaran() yang berfungsi menampilkan nama Class yang digunakan untuk melakukan pembayaran. Mari kita buat abstract class PaymentMethod :
19
Konsep Dasar
∼/sites/abstract-wal-interfaces/PaymentMethod.php
1 2 3 4 5 6 7 8 9
Selanjutnya, ubah class BNI agar mengekstends PaymentMethod. Untuk memudahkan contoh, saya akan merubah nama classnya menjadi DebitBNI: ∼/sites/abstract-wal-interfaces/DebitBNI.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
private function catatTransaksi($jenis, $jumlah) { echo "Mencatat transaksi $jenis sejumlah $jumlah ke Buku Tabungan. } public function kredit($jumlah) { $this->catatTransaksi('transfer keluar', $jumlah); $this->saldo -= $jumlah; } public function deposit($jumlah) { $this->catatTransaksi('deposit dana', $jumlah);
20
Konsep Dasar
27 28 29 30 31 32 33
$this->saldo += $jumlah; } public function cekSaldo() { return $this->saldo; } }
Mari kita buat demo untuk metode pembayaran ini: ∼/sites/abstract-wal-interfaces/beli-pakai-debitbni.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
deposit(20000000); $rahmat = new Pembeli("Rahmat Awaludin", $bniKu); $rahmat->beli("Buku Menyelami Framework Laravel", 250000); echo "Saldo terakhir Rp".$bniKu->cekSaldo()."\n"; echo $bniKu->cekNamaPembayaran(); } catch (Exception $e) { echo $e->getMessage()."\n"; }
Jika dijalankan, hasilnya akan seperti ini :
Membuat DebitBNI dengan abstract PaymentMethod
21
Konsep Dasar
Di baris terakhir output terlihat kita menggunakan implementasi PaymentMethod dengan class DebitBNI. Untuk implementasi Paypal, kita buat seperti ini: ∼/sites/abstract-wal-interfaces/Paypal.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public function __construct($email, $password) { // Ceritanya ini akses ke database if ($email == "
[email protected]" & $password == "12345") $this->email = $email; echo "Berhasil login ke Paypal!\n"; } else { $pesan = "User ada user dengan username/password t throw new Exception($pesan); } } private function kirimNotifikasi($pesan = "Informasi penting") { echo "Mengirim email notifikasi $pesan ke $this->email \n"; } public function kredit($jumlah) { $this->kirimNotifikasi('pengeluaran dana'); $this->balance -= $jumlah; } public function deposit($jumlah) { $this->kirimNotifikasi('penerimaan dana'); $this->balance += $jumlah; } public function cekSaldo() { return $this->balance; } }
Terlihat disini, class Paypal ini mengimplementasikan semua method dari class abstract PaymentMethod, ini diharuskan. Karena, sebagaimana saya jelaskan di pembahasan sebelumnya, class yang meng-
22
Konsep Dasar
ekstends abstract class harus mengimplementasikan semua abstract methodnya. Jika tidak, aplikasi akan error. Perbedaan lain di class Paypal adalah : • Untuk membuat object harus menggunakan email dan password yang kita hardcode di method __construct(). Tentunya, di kenyataannya Anda akan mengecek ini ke database. • atribut $balance digunakan untuk menyimpan dana. • Setiap kali ada transaksi uang masuk atau keluar, memanggil method kirimNotifikasi() yang disimulasikan akan mengirim email. Demo dari metode pembayaran ini : ∼/sites/abstract-wal-interfaces/Paypal.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
deposit(12000000); $rahmat = new Pembeli("Rahmat Awaludin", $paypalSaya); $rahmat->beli("Buku Menyelami Framework Laravel", 250000); echo "Saldo terakhir Rp".$paypalSaya->cekSaldo()."\n"; echo $paypalSaya->cekNamaPembayaran(); } catch (Exception $e) { echo $e->getMessage()."\n"; }
Outputnya akan menjadi :
Membuat Paypal dengan abstract PaymentMethod
23
Konsep Dasar
Jika diperhatikan, semua syntax method yang saya gunakan disini, sama dengan method yang saya pakai di demo dengan pembayaran DebitBNI. Inilah kekuatan dari abstract class. Kita bisa melakukan standarisasi nama method, apapun bentuk implementasinya. Itupun yang dilakukan oleh framework Laravel. • Pernahkah Anda merubah konfigurasi server database dari MySQL ke SQL Server? Apakah syntax Eloquent nya berubah? Tentu tidak. • Pernahkan Anda merubah konfigurasi email dari SMTP ke Mandrill/Mailgun? Apakah syntax untuk mengirim email di Laravel berubah? Tentu tidak. • dll Semua fleksibilitas itu muncul berkat bantuan abstraksi. Keren. Huff.. Capek. Silahkan istirahat dulu, ambil snack dan minumannya. Oh iya, saya titip kopi capucino dan roti bakar keju ya. Saya tunggu 20 menit lagi… …. ….
Interfaces Udah siap lagi?! Ckckck.. Anda ini memang bersemangat buat belajar Laravel.. Saya yakin dengan semangat seperti ini Anda akan menguasai framework ini kurang dari seminggu! :D Baiklah, sekarang kita akan bahas Interfaces. Interfaces Source code dari latihan ini bisa didapat di https://github.com/rahmatawaludin/abstractwal-interfaces⁶
PHP5 Namespace PHP5 Traits PHP5 Reflection Composer Jika Anda seorang developer PHP masa kini (cieee..), maka wajib kenal dengan Composer. Composer merupakan dependency management untuk PHP. ⁶https://github.com/rahmatawaludin/abstract-wal-interfaces
Konsep Dasar
24
Apaan tuh dependency management? Dependency management merupakan sebuah tools yang memecahkan masalah berikut : • Anda punya project yang butuh library. Misalnya, library buat kirim eksport data ke Excel yaitu PHPExcel⁷, terus DomPDF buat eksport ke PDF. • Library-library tersebut juga butuh library lainnya. Dalam kasus ini, PHPExcel butuh library ext-xml dan DomPDF butuh phenx/php-font-lib. • Anda males download (install) library tersebut secara manual. Cara kerja composer tuh seperti ini: • Anda menulis library apa saja yang dibutuhkan project. • Composer mencari versi library yang sesuai dan menginstallnya (download) secara otomatis. Dengan composer, kita tidak usah repot-report download library PHP manual satu-persatu. Begitupun dengan proses update library, tidak usah diupdate satu-persatu, cukup ubah satu file (composer.json), jalankan perintah composer update untuk mengupdate semua library. Gampang kan?
Instalasi Cara menginstall composer di sistem berbasis Unix (Linux dan OSX) dan Windows cukup berbeda. Namun tenang, di buku ini, saya akan menjelaskan untuk dua OS tersebut. Pengguna Linux. Buka terminal, jalankan perintah curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer
Sebelum menjalankan diatas, pastikan Anda sudah menginstall PHP.
. Pengguna OSX. Buka terminal, jalankan perintah
⁷https://github.com/PHPOffice/PHPExcel
25
Konsep Dasar
brew brew brew brew brew brew
update tap homebrew/homebrew-php tap homebrew/dupes tap homebrew/versions install php55-intl install homebrew/php/composer
Sebelum menjalankan diatas, pastikan sudah menginstall homebrew http://brew.sh
. Pengguna Windows. Buka browser (beda sendiri), download installer di https://getcomposer.org/ComposerSetup.exe⁸. Jalankan installer tersebut. Selesai. Setelah menginstall composer, coba buka terminal/command prompt di Windows (Tekan Window+R ketik cmd). Lalu jalankan perintah berikut: composer -V
Pastikan ada output seperti ini:
Sukses menginstall composer
Jika tampilan tersebut muncul, berarti Anda telah sukses menginstall composer. Selamat! Anda memang berbakat menjadi programmer Laravel! (y)
Penggunaan Yuk kita pelajari bagaimana cara pakai makhluk bernama composer ini. Saya akan bikin kasus dimana saya membutuhkan library Carbon⁹. Library ini digunakan untuk memanipulasi tampilan ⁸https://getcomposer.org/Composer-Setup.exe ⁹https://github.com/briannesbitt/Carbon
26
Konsep Dasar
objek DateTime. Pernah melihat tampilan tanggal “2 hour ago”, “2 minutes ago” atau “A month ago” di web? Nah, itu salah satu fungsi dari Carbon. Untuk mendapatkan package dengan Composer, pertama kita datang ke pusat package, kunjungi di packagist.org¹⁰. Setelah terbuka, ketikkan “carbon” di kotak pencarian dan klik pada hasil pertama yang muncul yaitu “nesbot/carbon”.
Mencari package Carbon di Packagist
Pada halaman selanjutnya, Anda dapat melihat detail dari package Carbon ini. ¹⁰http://packagist.org
27
Konsep Dasar
Detail package Carbon di Packagist
Beberapa informasi yang bisa Anda dapatkan di halaman ini yaitu: • • • • • •
Deskripsi package Total Install Website dokumentasi (Homepage) dan hosting source code Data pembuat package Update package terakhir Dependensi
Jika Anda mengunjungi website resmi dari package ini di https://github.com/briannesbitt/Carbon¹¹, Anda akan mendapatkan dokumentasi lengkap cara penggunaan package ini. ¹¹https://github.com/briannesbitt/Carbon
28
Konsep Dasar
Dokumentasi Carbon
Kembali ke halaman packagist, untuk menginstall package Carbon ini, coba Anda scroll agak ke bawah. Anda akan melihat beberapa versi dari Carbon. Ada dua jenis, yaitu versi dalam pengembangan (dev-master) dan stabil. Saran saya, selalu gunakan versi yang stabil.
29
Konsep Dasar
Versi Carbon
Pada contoh ini, saya akan menginstall versi 1.11.0 maka saya klik pada versi itu. Pada kotak yang muncul, copy pada tulisan setelah require. Yaitu "nesbot/carbon": "1.11.0".
30
Konsep Dasar
Pilih versi Carbon
Untuk menginstall package ini, mari buat sebuah folder misalnya di ∼/sites/coba-carbon. Pada folder ini, buatlah file baru bernama composer.json dengan isi: ∼/sites/coba-carbon
1 2 3 4 5
{ "require" : { "nesbot/carbon": "1.11.0" } }
Pada file ini, saya mem-paste teks dari packagist tadi di baris ke 3. Dengan composer, Anda cukup menyimpan nama dari package yang dibutuhkan dan versinya pada bagian require. Selanjutnya, untuk mendownload package tersebut, jalankan perintah: composer install
31
Konsep Dasar
Menginstall Carbon
Jika Anda berhasil mendownload Carbon, kini akan ada beberapa file dan folder baru di folder coba-carbon:
Struktuf folder composer
Biar lebih paham, berikut penjelasan file dan folder itu: • composer.json, ini file yang kita buat, berisi dependensi library dari project kita. • composer.lock, file ini mencatat versi package yang saat ini terinstal. • vendor, folder ini berisi package yang telah kita install. Setiap package yang kita tulis di bagian require akan di download ke folder ini.
32
Konsep Dasar
• vendor/autoload.php, berfungsi memanggil autoloader dari composer. Salah satu keunggulan dari composer adalah autoloader. Fitur ini berfungsi untuk memanggil class yang sesuai ketika kita membutuhkan class dari suatu library. Jadi, jika banyak library yang kita install kita hanya cukup menulis require untuk file vendor/autoload.php. Dan, autoload ini cukup cerdas dengan hanya me-load class yang kita butuhkan. Untuk mempraktekan penggunaan autoload ini, kita akan menggunakan library Carbon untuk menampilkan tanggal dalam bentuk “… ago”. Caranya, buatlah file index.php di ∼/sites/coba-carbon dengan isi: 1 2 3 4 5 6 7 8 9
{title="~/sites/coba-carbon/index.php", lang="php", linenos=on} ~~~~~~~~ diffForHumans()); ~~~~~~~~
File ini memiliki tugas yang sangat penting, yaitu… memberitahu Anda kapan Indonesia merdeka :D Oke, ini penjelasannya: • • • • •
Baris 2: me-require autoload dari composer. Baris 3: Menggunakan namespace (akan dijelaskan kemudian) kita meload library Carbon. Baris 4: Mengeset timezone default_content Baris 5: Membuat tanggal Baris 6: Memanggil tanggal dalam bentuk “… ago”
Untuk mengetesnya jalankan perintah ini dari folder ∼/sites/coba-carbon: php index.php
Berhasil mendemokan Carbon dengan composer
33
Konsep Dasar
Sip. Berhasil! Kini, ceritanya kita butuh package baru di project ini misalnya kita butuh mengakses dropbox untuk hosting file kita. Mari kita tambahkan package Flysystem¹². Package ini berguna untuk menyeragamkan syntax untuk mengakses file di FTP, AWS S3, Rackspace, Dropbox, Sftp, Zip dan WebDAV. Ubah file ∼/sites/coba-carbon/composer.json menjadi : ∼/sites/coba-carbon
1 2 3 4 5 6
{ "require" : { "nesbot/carbon": "1.11.0", "league/flysystem": "0.5.5" } }
Untuk menginstall package baru tersebut, jalankan perintah composer update ¹²http://flysystem.thephpleague.com
34
Konsep Dasar
Update composer untuk menginstall package baru
Perintah ini, selain berfungsi menginstall package baru yang ditambahkan di bagian require, juga berfungsi mengupdate package yang telah terinstall jika kita merubah versi package yang digunakan. Jika dibutuhkan, Anda juga dapat menginstruksikan composer untuk menginstall package hanya untuk development. Caranya dengan membuat key require-dev di composer.json berisi package yang Anda butuhkan hanya pada saat development. Untuk menginstall/mengupdate berikut package yang berada di require-dev ini, jalankan composer dengan opsi --dev. Saya rasa penjelasan sekilas tentang composer ini sudah cukup. Masih banyak topik lain dari composer misalnya membuat package dan repository privat yang bisa Anda pelajari di https://getcomposer.org/doc¹³. Source code dari latihan ini bisa didapat di https://github.com/rahmatawaludin/cobacarbon¹⁴
¹³https://getcomposer.org/doc ¹⁴https://github.com/rahmatawaludin/coba-carbon/commits/master