Tutorial OOP Lanjutan

Latihan Membuat Validation Utility

Materi ini memiliki 1 buah lampiran. Namun Anda tidak dapat mengakses lampiran karena belum terdaftar di kursus ini. Klik disini untuk mendaftar.

Pada video ini kita akan latihan untuk membuat kelas ValidationUtility, yaitu kelas yang akan membantu kita untuk melakukan validasi terhadap objek data. Kelas ini hanya memiliki satu buah method yaitu validate dengan parameter yang berupa objek. Kita bisa mengirimkan objek apa pun sebagai parameter. Sebagai contoh disini ada kelas LoginData yang berisi 2 properties, yaitu $id dan $password. Contoh lainnya adalah AccountData yang memiliki lebih banyak properties yaitu $id, $password, $name dan $email.

Object dari kedua kelas ini bisa kirimkan sebagai argument pada method validate. Method validate akan memeriksa semua property milik object, untuk memastikan bahwa nilai pada property sudah pernah diinisialisasi. Dan juga memastikan bahwa tidak ada property yang diisi dengan nilai null. Apabila ada nilai property yang tidak valid, maka method akan melempar error.

Yang perlu diperhatikan disini adalah berhubung method bisa menerima objek apa pun sebagai parameter, maka kita tidak tau apa saja property yang dimiliki oleh objek. Jadi kita harus membaca property-nya pada saat script berjalan. Kita bisa melakukan hal ini dengan menggunakan Reflection yang baru saja kita pelajari pada video sebelumnya.

Ini adalah contoh kode yang sudah jadinya ya. Misalkan kita memiliki folder data yang menampung kode untuk LoginData.php dan AccountData.php. LoginData hanya berisi 2 buah property yaitu $id dan $password. Sedangkan AccountData memiliki 4 buah property yaitu $id, $password, $name dan $email.

Kemudian ada folder helper yang berisi ValidationUtility. Untuk saat ini saya tidak akan membuka file ValidationUtility ya, karena file inilah yang menjadi soal latihan kali ini. Kalian harus berusaha untuk menulis sendiri kode ValidationUtility dengan menggunakan bantuan dari ReflectionClass yang telah kita pelajari pada video sebelumnya.

Pada folder utama ada file validation.php. Ini adalah script utama kita. Di dalamnya kita menggunakan file LoginData, AccountData dan ValidationUtility. Pertama kita buat dahulu objek Login, dengan data id ‘admin’ dan password ‘admin123’. Kemudian di bawahnya kita coba menggunakan try untuk membuat objek validationUtility dan memanggil method validate dengan menggunakan object $login sebagai argument.

Kita coba jalankan dan kita mendapatkan hasil validasi sukses. Kalau misalkan kita hapus inisialisasi nilai property $id. Maka kita mendapatkan error id belum diinisialisasi. Kemudian kalau misalkan kita mengisi nilai $id dengan null, maka kita mendapatkan error id bernilai null. Kita perbaiki dahulu nilai $login agar validasi kembali berhasil ya.

Kemudian kita coba dengan object Account. Berhubung keempat property sudah diinisialisasi, maka hasilnya adalah validasi sukses. Namun kalau salah satu property saya hapus, misalkan property nama. Maka kita mendapatkan error nama belum diinisialisasi. Misalkan kita perbaiki, namun nilai email kita ganti menjadi null. Maka kita mendapatkan error email bernilai null.

Oke, sebagai latihan pada video ini, buatlah kelas ValidationUtility. Kelas ini hanya memiliki satu method validate dengan parameter object, dan dapat menerima objek apapun untuk divalidasi. Kita akan memeriksa semua property milik object, dan memeriksa apakah nilainya sudah pernah di-inisialisasi. Kemudian kita periksa apakah nilainya null. Kalau tidak memenuhi syarat maka kita melempar error. Sedangkan kalau validasi suksed, maka kita tulis “Validation succeeds”.

Pause terlebih dahulu video ini dan coba kerjakan latihan pada komputer masing-masing. Kalau sudah selesai, nantinya teman-teman bisa mencocokkan jawaban dengan video berikutnya.

Kita coba kerjakan latihan ya. Kita buka file ValidationUtility.php. Pertama kita buat dahulu kelas ValidationUtility yang isinya adalah satu buah method validate dengan parameter Object $object. Mengembalikan hasil void.

Pertama kita baca dahulu struktur kelas dari parameter $object. Kita bisa melakukan hal ini dengan bantuan ReflectionClass. Kita inisialisasi dahulu variable $reflection yang nilainya adalah new ReflectionClass dengan argument $object.

Kemudian kita ambil daftar propertiesnya dengan kode $properties = $reflection->getProperties(). Kita lakukan loop untuk setiap property dengan kode foreach($properties as $property). Lalu kita buat variable $name untuk menyimpan nilai dari $property->name. Dan kita coba echo nilai dari variable $name.

Kita simpan dan kita buka file validation.php. Pertama kita coba panggil method validate menggunakan objek $login dahulu ya. Disini ada 2 buah property yaitu id dan password. Kita coba jalankan. Dan kita mendapatkan daftar kedua property tersebut.

Oke, sampai disini kita masih mengulangi apa yang telah kita pelajari dari video sebelumnya. Selanjutnya kita akan memeriksa apakah nilai property sudah pernah diinisialiasi. Kita buka dahulu dokumentasi php mengenai reflection. Kita cari dokumentasi ReflectionProperty. Kita lihat ke daftar method-nya ya. Untuk memeriksa apakah nilai property sudah pernah diinisialisasi atau belum, kita menggunakan method isInitialized.

Kita lihat keterangan detail dari methodnya ya. Disini tertulis bahwa method memerlukan satu buah parameter yaitu object-nya. Berhubung ReflectionClass hanya mengandung data mengenai kelas, sedangkan nilai property disimpan di dalam objek, maka kita perlu mengirimkan objeknya sebagai argument.

Kita coba ya. Kita gunakan percabangan if. Berhubung error terjadi apabila nilai belum diinisialisasi, atau hasil methodnya adalah false, maka kita gunakan tanda !. Kita panggil $property->isInitialized dengan argument $object. Di dalam percabangan kita throw new Exception dengan pesan kesalahan “Error: $name is not initialized”. Di luar foreach, kita tulis “Validation succeeds\n”.

Kita simpan dan jalankan. Kita mendapatkan pesan “Validation succeeds”, karena semua nilai property sudah pernah diinisialisasi. Kalau misalkan kita ubah inisialisasi $id menjadi komentar, maka kita mendapatkan “Error: id is not initialized”. Sedangkan kalau inisialisasi $password yang diubah menjadi komentar, maka pesan errornya menjadi “Error: password is not initialized”.

Kita coba ganti nilai ‘id’ menjadi null. Dan kalau kita jalankan, kita mendapatkan hasil sukses ya. Seharusnya hasilnya adalah error, namun kita belum melakukan validasi terhadap nilai null.

Untuk melakukan validasi, maka pertama kita harus mengambil dahulu nilai yang disimpan oleh property. Kita buka lagi dokumentasi. Kembali ke kelas ReflectionProperty. Kita cari method yang sesuai kebutuhan kita ya. Nama methodnya adalah getValue. Dan disini kita juga diminta untuk mengirimkan objeknya sebagai argument.

Kita buat variable $value untuk menampung hasil dari $property->getValue($object). Kemudian kita periksa apakah nilainya null dengan cara memanggil fungsi is_null. Kalau misalkan null, maka kita throw new Exception dengan pesan “Error: $name is null”.

Kita simpan dan coba jalankan. Maka kita mendapatkan pesan “Error: id is null”.

Kita coba menggunakan objek $account ya. Pertama hasilnya adalah Validation Succeed karena semua nilai property telah kita inisialisasi. Kalau misalkan kita hapus nilai name. Maka kita mendapatkan pesan “Error: name is not initialized”. Sedangkan kalau kita ganti nilai password menjadi null, maka kita mendapatkan pesan “Error: password is null”.

Oke, kita sudah berhasil mengerjakan latihan kita kali ini. Kelebihan dari ValidationUtility disini adalah bersifat flexible. Bisa kita gunakan pada object apa saja.

Namun ValidationUtility juga memiliki kelemahan, yaitu kita selalu memeriksa apakah sudah pernah diinisialisasi dan apakah bernilai null pada semua property milik objek. Padahal seharusnya setiap property pada object memiliki karakteristik masing-masing. Ada property yang boleh null, dan ada property yang tidak boleh null.

Kalau kita ingin agar ValidationUtility bersifat lebih flesible, misalkan hanya menvalidasi nilai null terhadap property yang tidak boleh null saja, maka kita perlu menambahkan metadata pada property. Sejak PHP versi 8, kita bisa melakukan hal ini dengan menggunakan fitur barunya yaitu Attribute. Berhubung penjelasan fitur Attribute cukup panjang, maka akan saya pisahkan menjadi satu video khusus. Untuk video kali ini saya akhir dahulu disini, dan sampai bertemu lagi di video berikutnya.

2 Jam 26 Menit

Dengan menggunakan fasilitas tanya jawab, maka Anda bisa bertanya dan akan dijawab langsung oleh instruktur kursus.

Anda belum terdaftar pada kursus ini sehingga tidak bisa mengajukan pertanyaan.