Tag Archives: design pattern

Implementasi Table Data Gateway di PHP

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

Memahami Table Data Gateway Pattern

Table Gateway pattern adalah salah satu dari sekian design pattern yang dapat digunakan untuk melakukan hubungan antara class dengan database.Table Gateway ini bertujuan untuk menghandle semua baris dalam sebuah table database.

Media_httpblogitsacid_umsxe

Seringkali para pengembang sebuah perangkat lunak menemui kebutuhan untuk menyimpan data pada media disk yang permanen, salah satunya adalah disimpan dalam database. Untuk membangun sebuah database dibutuhkan proses tersendiri dalam merancang dan membangun database tersebut yang tidak discover dalam bahasan kali ini.

Nah, untuk menggunakan database(Relational) dalam pemrograman berbasis objek bisa dikatakan susah susah gampang, umumnya para programmer pemula akan melakukan pengkodean campur antara kode logic dengan kode sql untuk menghubungkan antara aplikasi, berdasarkan banyak literature dan pengalaman pribadi tentunya, hal ini sangatlah tidak baik dan merupakan kebiasaan yang sangat harus dihindari.

Dengan bercampurnya kode logic dengan kode sql paling tidak ada beberapa masalah yang dapat muncul misalnya kode logic semakin sulit untuk dilihat (dalam bahasa gaul ini mbikin mata picek!) akibatnya jika sulit untuk dilihat akan sulit pula untuk dimaintain. Kebanyakan programmer juga sebenarnya tidak nyaman dalam menulis program yang memiliki cara campur aduk seperti ini (spaghetti code), dan walaupun ada yang nyaman akan memungkinkan terjadi banyak kesalahan dalam pembuatannya.

Sebenarnya mengapa hal sulit dalam pembuatan aplikasi Object Oriented(OO) yang menggunakan database (Relational) adalah adanya perbedaan secara konseptual pada keduanya.. dimana memang programmer dituntut untuk berfikir Objek dan Relasi secara bersamaan, bayangkan saja jika anda diminta berbahasa 2 bahasa sekaligus.. tentu akan ribet…:hammer:

Cara kerja pattern ini persis seperti namanya yaitu sebagai pintu gerbang antara objek yang diminta dengan database, sehingga nantinya objek yang diminta dapat digunakan dalam aplikasi yang dibuat seperti halnya mengakses objek biasa. TableGatweay akan berisi method – method yang berhubungan dengan behavior yang bisa dilakukan untuk semua baris yang ada di dalam table. Misalnya saja method find_by_id(..) , add(..) del_by_id(..) dan lain sebagainya yang nantinya method – method ini akan mengenerate sql yang akan diproses di database.Ciri utama dari TableGateway adalah walaupun sesimple apapun akan mengembalikan kumpulan dari baris yang ada di table, bukan baris yang bersangkutan saja. Misal method find_by_id(..) dipanggil akan mengembalikan array dari object yang diinginkan, dimana bisa saja isi array tersebut hanya satu saja.Contoh implementasi dalam class diagram adalah seperti berikut :

Media_httpblogitsacid_gngkj