Dari blog saya memahami-table-gateway-pattern saya akan mencoba mencontohkan implementasi SEDERHANA pada PHP,
Implementasi ini menggunakan teknik pemrograman Metaprogramming bagi yang memang merasa tidak suka bisa mencoba teknik code generation namun
Kalo menggunakan code generation ya silakan dicoba sendiri.. hehehe
Ok langsung 2 the point, pertama buat dulu table mahasiswa dengan field2 yang seperti di bawah ini :
mysql> desc mahasiswa;
+——–+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——–+————–+——+—–+———+——-+
| nrp | int(10) | NO | PRI | NULL | |
| nama | varchar(255) | YES | | NULL | |
| gender | tinyint(1) | YES | | NULL | |
+——–+————–+——+—–+———+——-+
3 rows in set (0.23 sec)
Lalu tahap kedua saya membuat class TableGateway secara umum terlebih dahulu yang nantinya akan dijadikan parent class untuk class Gateway per table :
<?php
/**
@author radityo pw ([email protected])
**/
class TableGateway{
protected $db;
protected $table;
public function __construct($db,$table){
$this->db = $db;
$this->table = $table;
}
protected function generate_sql($mode,$data=array(),$where=”1=1″){
$sql = “”;
$table = $this->table;
switch($mode){
case “add” :
$sql = “INSERT INTO $table”;
$akey = array();
$avalue = array();
foreach ($data as $key => $value) {
$akey[] = $key;
$avalue[] = “‘”.$value.”‘”;
}
$skey = implode(“,”,$akey);
$svalue = implode(“,”,$avalue);
$sql .= “(“.$skey.”) values(“.$svalue.”)”;
break;
case “del” :
$sql = “DELETE FROM $table WHERE $where”;
break;
case “edit” :
$sql = “UPDATE $table SET”;
$aupdate = array();
foreach ($data as $key => $value) {
$aupdate[] = “$key=’$value'”;
}
$supdate = implode(“,”,$aupdate);
$sql .= ” $supdate WHERE $where”;
break;
}
return $sql;
}
public function search($where_condition,$order_by = null,$offset = null,$size = null){
$sql = “SELECT * FROM “.$this->table.” WHERE “.$where_condition;
if($order_by != null){
$sql = $sql.” ORDER BY “.$order_by;
}else if($offset != null){
$sql = $sql.” LIMIT “.$offset.”,”.$size;
}
$sth = $this->db->prepare($sql);
$sth->execute();
return $sth->fetchAll(PDO::FETCH_ASSOC);
}
protected function find_by($prefix,$arguments,$order_by = null,$offset = null,$size = null){
$sql = “SELECT * FROM “.$this->table.” WHERE “.$prefix.” = ‘”.$arguments.”‘”;
if($offset != null){
$sql = $sql.” LIMIT “.$offset.”,”.$size;
}
if($order_by != null){
$sql = $sql.” ORDER BY “.$order_by;
}
$sth = $this->db->prepare($sql);
$sth->execute();
return $sth->fetchAll(PDO::FETCH_ASSOC);
}
protected function delete_by($prefix,$arguments){
$sql = $this->generate_sql(“del”,array(),$prefix.” = ‘”.$arguments.”‘”);
$sth = $this->db->prepare($sql);
$sth->execute();
}
protected function edit_by($prefix,$value,$arguments){
$sql = $this->generate_sql(“edit”,$arguments,$prefix.” = ‘”.$value.”‘”);
$sth = $this->db->prepare($sql);
$sth->execute();
}
public function add($data){
$sql = $this->generate_sql(“add”,$data);
$sth = $this->db->prepare($sql);
$sth->execute();
}
public function findAll($order_by = null,$offset = null,$size = null){
$sql = “SELECT * FROM “.$this->table;
if($order_by != null){
$sql = $sql.” ORDER BY “.$order_by;
}
if($offset != null){
$sql = $sql.” LIMIT “.$offset.”,”.$size;
}
$sth = $this->db->prepare($sql);
$sth->execute();
return $sth->fetchAll(PDO::FETCH_ASSOC);
}
public function deleteAll(){
$sql = $this->generate_sql(“del”);
$sth = $this->db->prepare($sql);
$sth->execute();
}
public function __call($name, $arguments) {
if(strpos($name, “find_by_”) !== FALSE){
$prefix = str_replace(“find_by_”, “”, $name);
if(count($arguments) == 1){
return $this->find_by($prefix,$arguments[0]);
}else if(count($arguments) == 2){
return $this->find_by($prefix,$arguments[0],$arguments[1]);
}else if(count($arguments) == 4){
return $this->find_by($prefix,$arguments[0],$arguments[1],$arguments[2],$arguments[3]);
}
}else if(strpos($name, “delete_by_”) !== FALSE){
$prefix = str_replace(“delete_by_”, “”, $name);
$this->delete_by($prefix,$arguments[0]);
}else if(strpos($name, “edit_by_”) !== FALSE){
$prefix = str_replace(“edit_by_”, “”, $name);
$this->edit_by($prefix,$arguments[0],$arguments[1]);
}
}
}
/*END OF FILE*/
Dari kode di atas dapat dilihat saya menggunakan magic method __call(…) dimana tujuannya adalah memberikan fleksibilitas dalam pemanggilan dan pengesetan attribute dari class
Misalnya seperti contoh di atas bahwa table mahasiswa terdapat field nrp, maka nanti saya dapat mencari mahasiswa yang bernrp tertentu menggunakan
$class->find_by_nrp(…..) , yang sebenarnya ini dimapping ke fungsi find_by(,…..). untuk koneksi database dalam hal ini menggunakan PDO.
Langkah selanjutnya tinggal membuat class gateway per table yang diinginkan, dalam hal ini yaitu MahasiswGateway.php :
<?php
require_once(“TableGateway.php”);
class MahasiswaGateway extends TableGateway{
public function __construct($db){
parent::__construct($db,’mahasiswa’);
}
public function search_top_ten(){
return $this->findAll(null,0,10);
}
}
/*END OF FILE*/
Dari class MahasiswaGateway dapat dilihat melakukan penurunan dari class TableGateway berarti nantinya kemampuan TableGateway akan diturunkan ke MahasiswaGateway, sekarang mari buat Test Class nya :
<?php
require_once(‘MahasiswaGateway.php’);
$dsn = ‘mysql:dbname=test_for_blog;host=127.0.0.1’;
$user = ‘root’;
$password = ”;
try {
$dbh = new PDO($dsn, $user, $password,array( PDO::ATTR_PERSISTENT => true));
} catch (PDOException $e) {
echo ‘Connection failed: ‘ . $e->getMessage();
exit(1);
}
$mhs_gateway = new MahasiswaGateway($dbh);
$data = array(
‘nrp’=>’5202100002’,
‘nama’=>’radityo prasetianto wibowo’,
‘gender’=>0
);
$mhs_gateway->add($data);
var_dump($mhs_gateway->find_by_nama(‘radityo prasetianto wibowo’));
/*END OF FILE*/
Nah dari Test Class diatas dapat diluihat untuk menginsert data saya hanya membutuhkan sebuah associative array (HashMap kalo di Java) lalu saya tinggal memasukkan dalam method add..
Jika ingin melakukan pencarian dengan filter sebuah field , maka tinggal melakukan pemanggilan layaknya memanggil atribut biasa.. (find_by_nama(…..)) seperti pada contoh diatas.
Masih banyak fungsi2 yang belum tercover pada Test class ini namun dapat anda coba langsung..
Jika anda tertarik dan ingin berdiskusi jangan sungkan untuk mengemail saya di radityo_pw[at]is.its.ac.id