__get() dan __set() Pada Laravel Model

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Oct 04, 2020 — 5 mins read
Photo by <a href="https://unsplash.com/@foxfox" target="_blank">Natalia Y</a> on <a href="https://unsplash.com" target="_blank">Unsplash</a>

Photo by Natalia Y on Unsplash

seperti yang sudah kita ketahui, Laravel sudah sangat jauh berkembang sejak kelahiranya tahun 2011 silam, sampai tulisan ini dubat laravel sudah mencapai versi 8 dengan segudang fitur-fitur barunya, seperti jet-stream, livewire dan lain-lain. Tetapi saya tidak ingin membahas bagian tersebut, karena saya sendiri masih menyelami versi terbaru ini.

Kali ini saya ingin mengulas sedikit tentang cara kerja dari laravel model, saya yakin masih banyak dari teman-teman yang hanya menggunakan laravel model tanpa mengetahui bagaimana sebenarnya laravel model bekerja dibelakang layar sehingga kita bisa merasakan kemudahan-kemudahan dalam melakukan query ke database ataupun memanggil bagian-bagian tertentu dari model tersebut.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
	protected $table="tbl_user";
	protected $attributes = [
		"nama_depan"=>"Kurosaki",
		"nama_belakang"=>"Ichigo"
	];
}

yap, benar sekali, yang teman-teman lihat pada kode diatas adalah bentuk dari laravel model seperti biasanya, tidak ada yang aneh, tidak ada yang tidak biasa. Jika kita memanggil model tersebut untuk mendapatkan datanya juga dipanggil seperti biasanya, misalnya seperti.

use App\User;
$user = User::find(1);
echo $user->username;
echo $user->email;

atau bahkan jika kita ingin memanggil custom attribute seperti nama_depan atau nama_belakang, kita cukup memanggilnya seperti halnya kita memanggil hasil elequent collection seperti biasa, misalnya

$user->nama_depan;
$user->nama_belakang;

mungkin teman-teman bingung yang menjadi permasalahan disini apa, ya memang tidak ada masalah, jadi tidak perlu dipermasalahkan, yang menjadi konsen saya adalah masih banyak yang belum mengetahui kenapa kita bisa memanggil $user->nama_belakang atau $user->nama_depan, sedangkan kita tahu jika variable nama_depan dan nama_belakang merupakan sebuah isi dari array dengan nama variable $attrubutes, bukanya seharusnya kita memanggilnya dengan menyebutkan indexnya ? $user->attributes[0] atau $user->attributes[1] ? yang kita juga tahu jika varible $attributes memiliki tipe protected yang mana teman-teman pasti sudah paham maksudnya.

seharusnya jika tipe variabel nya protected kita membutuhkan setter atau getter atau apapun lah sebutnya, karena kita akan mengakses protected property dari sebuah class bukan ?

Magic Method

sangat penting untuk diketahui, jika magic method bukanlah milik laravel, melainkan method yang sudah ada pada PHP, dan secara ekslusive digunakan oleh laravel, jika teman-teman sudah membaca tulisan saya tentang OOP pada php, seharusnya sudah mengenal tentang hal ini.

Magic method secara default ada pada semua class yang didifinisikan oleh PHP, hanya saja sebagian tidak terlihat, yang paling umum adalah __construct() atau __desctruct(), saya tidak akan menjelaskan semua tentang magic method pada tulisan ini, karena saya ingin lebih fokus kepada laravel model.

secara default, Magic Method tidak akan pernah dipanggil oleh programmer secara langsung, karena secara default php akan memanggilnya diblakang layar, nah jika ada magic method yang dipanggil oleh programmer dalam sebuah class artinya method tersebut memiliki tujuan tersendiri atau si programmer ingin melakukan hal-hal tertentu. misalnya

class Kelasku
{
	public $nama;
	function __construct($nama){
		$this->nama;
	}
}

cukup jelas maksudnya, si programmer meng-inginkan jika class tersebut di-inisialisasikan harus dengan mengikutsertakan parameter $nama, dengan tujuan agar properti $nama memiliki nilai dari parameter tersebut. jika teman-teman sudah terbiasa dengan OOP pasti sudah tidak asing dengan bentuk yang seperti ini.

seperti yang saya sebutkan diawal, kita tidak akan membahas detail tentang Magic method pada PHP, melainkan mencoba mengulas sedikit penggunaan dan manfaatnya pada laravel model.

__get()

Model pada laravel cukup spesial menurut saya pribadi, model pada laravel tidak menyimpan attribute data secara langsung pada attribute class, melainkan pada sebua properti dengan nama protected $attributes yang mana bentuknya merupakan asosiatif array dari semua data yang terdapat pada sebuah model, karena sifatnya yang protected secara umum kita tidak bisa memanggilnya secara langsung, kecuali melalui beberapa proses tambahan, mari kita bandingkan perbedaan antara model laravel dan php class biasa dalam menangai attribute tersebut.

<?php
class Pengguna
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'pekerjaan'=>'Shinigami Pengganti'
	];
}
$pengguna = new Pengguna;
echo $pengguna->nama; // hasilnya Kurosaki Ichigo
echo $pengguna->attributes['pekerjaan']; // hasilnya akan Error Cannot access protected property
echo $pengguna->pekerjaan; // hasilnya Error

sekarang kita bandingkan dengan model pada laravel

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pengguna extends Model
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'nama'=>'Kurosaki Ichigo'
	];
}
$pengguna = new Pengguna;
echo $pengguna->nam; // Hasilnya Kurosaki Ichigo
echo $pengguna->pekerjaan; // Hasilnya Shinigami Pengganti

apa yang membedakan ? kenapa pada laravel model tidak terjadi error ? kenapa pada laravel model kita bisa memanggil $pengguna->pekerjaan sedangkan tidak pada class php normal ?

itu semua mungkin karena laravel menggunakan Magic Method __get(), sekarang mari kita coba terapkan Magic method tersebut pada class php sebelumnya (non laravel), dengan harapan kita bisa memanggil $pengguna->pekerjaan layaknya seperti pada laravel model

<?php
class Pengguna
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'pekerjaan'=>'Shinigami Pengganti'
	];

	public function __get(string $key)
	{
		return $this->attributes[$key];
	}
}
$pengguna = new Pengguna;
echo $pengguna->pekerjaan; // Hasilnya Shinigami Pengganti

yang perlu kita pahami adalah, Magic Method __get() hanya akan dipanggil secara otomatis ketika tidak ada attribute dengan nama yang sama ditemukan didalam sebuah class, mari kita lihat contohnya

<?php
class Pengguna
{
	public $pekerjaan = "Bukan Quincy";
	protected $attributes = [
		'pekerjaan'=>'Shinigami Pengganti'
	];

	public function __get(string $key)
	{
		return $this->attributes[$key];
	}
}


$pengguna = new Pengguna;
echo $pengguna->pekerjaan; // Hasilnya Bukan Quincy

dari sini teman-teman bisa memahmi alasanya bukan ? sangat banyak fungsi-fungsi laravel model yang menggunakan magic method __get(), jika teman-teman menggali lebih dalam pasti teman-teman akan menemukan pemanfaatan yang beragam.

dari sini teman-teman sudah mengerti bukan alasan kenapa kita bisa memanggil $pengguna->pekerjaan ataupun attribute lainya pada laravel model dengan begitu mudah ?

__set()

tidak kalah menarik, magic method yang satu ini juga menjadi salah satu alasan dari kemudahan kita bekerja dengan laravel model. hanya saja bedanya __set() digunakan untuk menentukan sebuah value dari attribute, mari kita bedakan lagi antara class php biasa dan model laravel

<?php
class Pengguna
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'pekerjaan'=>'Shinigami Pengganti'
	];

	public function __get(string $key)
	{
		return $this->attributes[$key];
	}
}
$pengguna = new Pengguna;
$pengguna->nama = "Uzumaki Naruto";
echo $pengguna->nama; // Hasilnya Uzumaki Naruto
$pengguna->pekerjaan = "Hokage"; // Hasil Error.

mari kita lihat pada sisi laravel

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pengguna extends Model
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'nama'=>'Kurosaki Ichigo'
	];
}
$pengguna = new Pengguna;
$pengguna->nama = "Uzumaki Naruto";
$pengguna->pekerjaan = "Hokage";
echo $pengguna->pekerjaan; // Hasilnya Hokage

sama halnya seperti __get(), __set() juga mengambil peran penting disini, sekarang mari kita modifikasi class php kita agar bisa bekerja layaknya model pada laravel.

<?php
class Pengguna
{
	public $nama = "Kurosaki Ichigo";
	protected $attributes = [
		'pekerjaan'=>'Shinigami Pengganti'
	];

	public function __get(string $key)
	{
		return $this->attributes[$key];
	}
	public function __set($key, $value)
	{
		$this->attribute[$key] = $value;
	}
}


$pengguna = new Pengguna;
$pengguna->nama = "Uzumaki Naruto";
$pengguna->pekerjaan = "Hokage";
echo $pengguna->pekerjaan; // Hasilnya Hokage

And here we go!, kita berhasil menemukan rahasia kenapa laravel model bisa bekerja seperti itu, perlu dicatat contoh __get() dan __set() pada tulisan ini kita buat sesederhana mungkin, agar teman-teman bisa memahami konsep dasarnya, walaupun jika kita selami lebih dalam maka akan sangat banyak kasus yang bisa kita pecahkan dengan hanya bermodalkan __get() dan __set().

silahkan teman-teman pelajari sendiri source code laravel jika ingin mengetahui lebih dalam tentang penerapan __get() dan __set() pada laravel model.

laravel php
Read More

Membuat Backup Database Otomatis pada Laravel

Pada dasarnya, proses backup merupakan satu workflow yang harus dilakukan dalam pemeliharaan sebuah aplikasi, dengan tujuan untuk menghindari kehilangan data, sejatinya proses ini bisa dilakukan secara manual, semi otomatis maupun full otomatis, tergantung dari sudut mana kita melihat kemudahanya.

Read More

PHP Fungsi Terbilang

merubah angka menjadi bentuk terbilang dalam bahasa indonsia dengan php