Monday, December 28, 2009

Symfony dan Doctrine

Mungkin ada yang pernah mengalamin, membuat aplikasi yang logic / bisnis proses ada di database (mengunakan store procedure, triger, dsb) saat pertama aplikasi menggunakan Database Microsoft SQL Server atau Microsoft Access deh...., eh........ terus terjadi migrasi database ke MySQL Server. Akan menjadi repot untuk menulis ulang logic/ bisnis proses ke database yang baru.

Salah satu solusi adalah menggunakan ORM (Object Relational Mapper) agar flexibel bila terjadi pindah database. pada ORM dapat menuliskan logic / bisnis proses kemudian ORM yang akan melakukan request ke database yang digunakan.

Salah satu ORM (Object Relational Mapper) yang ada di php dan disediakan pluginnya di symfony framework adalah DOCTRINE dgn Feature Doctrine Query Languange sebagai alternatif SQL.


Sebelum melanjutkan baca posting ini sebaiknya sudah mengerti lebih dahulu mengenai symfony framework (misalkan instalasi framework, membuat aplikasi, modul, dan plugin). kalau mau baca silakan dilanjut aja..

Oke langsung aja cara membuat nya:

Tahap 1.
Sebagai database sample untuk manipulasi data ORM Doctrine, database yg dibuat adalah symfBrige dengan tabel tunggal yaitu tbl_telepon, dibawah ini struktur tabelnya:
CREATE DATABASE symfBrige;
USE symfBrige;

CREATE TABLE `tbl_telepon` (
`kode` int(11) NOT NULL AUTO_INCREMENT,
`nama` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`telepon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`kelamin` enum('1','0') COLLATE utf8_unicode_ci DEFAULT '1',
PRIMARY KEY (`kode`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Tahap 2
Download plugin ORM Doctrine di http://www.symfony-project.org/plugins/sfDoctrinePlugin
setelah di download ekstrak ke folder plugins smfony framework dan rename nama plugin nya menjadi seperti gambar dibawah ini:


Tahap 3
Lakukan clear cache symfony
php symfony cc

Tahap 4
Mengaktifkan plugin doctrine di config/ProjectConfiguration.class.php, lokasi nya seperti gambar di bawah ini



kemudian ketikan source code dibawah ini:
require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
$this->enableAllPluginsExcept(array('sfPropelPlugin'));
}
}
atau

require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
$this->enablePlugins(array('sfDoctrinePlugin'));
}
}

Tahap 5
Membuat koneksi database di file config/databases.yml lokasi nya seperti gambar dibawah ini:



kemudian tuliskan configuration conection databases dibawah ini:
all:
doctrine:
class:        sfDoctrineDatabase
param:
#classname:  DebugPDO
dsn:        mysql:dbname=symfBrige;host=127.0.0.1
username:   root
password:   pass
encoding:   utf8
persistent: true
pooling:    true

untuk nama database, username, password, host dapat disesuikan dengan yang dibutuhkan

Tahap 6
Buat aplikasi dengan nama frontend (bila sudah ada tidak perlu dibuat)
php symfony generate:app frontend
kemudian buat sebuah modul doctrieTest di aplikasi frontend
php symfony generate:module frontend doctrieTest
bila proses membuat aplikasi dan modul berhasil maka struktur file nya menjadi seperti dibawah ini:


Tahap 7
Lakukan clear cache symfony
php symfony cc

Tahap 8
Membuat schema dari database yang gunakan. ketikan task symfony di bawah ini:
symfony doctrine:build-schema frontend
Tulisan frontend adalah nama aplikasi. Bila building schema berhasil maka akan terbentuk sebuah file bernama schema.yml, lokasinya seperti gambar dibawah ini:



Tahap 9
Membuat model class php berdasarkan schema.yml yang telah dibuat, ketikan task symfony dibawah ini:
symfony doctrine:build-model frontend

Tulisan frontend adalah nama aplikasi. bila proses build-model berhasil maka akan terbentuk model class seperti gambar dibawah ini:


class model yang terbentuk adalah nama file yang berawalan TblTelepon.

Tahap 10
Lakukan clear cache symfony
php symfony cc

Tahap 11
Pada actions module doctrieTest aplikasi frontend , lokasi nya seperti gambar dibawah ini:


dapat di tulisakan sintak-sintak untuk Doctrine Query Languange (DQL) atau Native SQL seperti contoh dibawah ini:

DQL Untuk mengambil semua data dari tabel tbl_telepon
$q = Doctrine_Query::create()
->select('t.*')
->from('TblTelepon t');
$data = $q->fetchArray();
print_r($data);
exit;

Untuk mengambil semua data dari tabel tbl_telepon secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection();
$query = "select * from tbl_telepon";
$data = $con->fetchAssoc($query);
print_r($data);
exit;

Untuk update data secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection();
$query = "update
tbl_telepon set nama='DENDIE SANJAYA' where kode='1'";
$data = $con->execute($query);
exit;

Memanggil store procedure secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection();
$query = "call sp_telepon";
$data = $con->fetchAssoc($query);
print_r($data);
exit;

Tahap 12 (Optional)

Tahap ini disebut optional karna bisa ada atau tidak, tahap ini adalah untuk melakukan override class dari model class yang telah dibuat, override berguna untuk menambahkan fungsionalitas dari class tersebut tanpa perlu "menyentuh" super class model tersebut.

sebagai contoh pada model class TblTelepon (yg telah dibuat diatas tadi) akan di tambahkan sebuah metod/function untuk pencarian nomor telepon. cara membuat nya dibawah ini, edit file TblTelepon.class.php lokasinya ada pada gambar dibawah ini:


pada file tersebut tambahkan kode program :
class TblTelepon extends BaseTblTelepon
{
static public function findNomor($nama)
{
$con = Doctrine_Manager::connection();
$query = "select telepon from tbl_telepon where nama='$nama'";
$data = $con->fetchAssoc($query);
return $data;
}
}
Dan pada actions module doctrieTest aplikasi frontend, untuk mencari nomor telepon cukup dengan memanggil metod findNomor
$data = TblTelepon::findNomor('dendie sanjaya');
print_r($data);
exit;
class yang telah di override (TblTelepon.class.php) diatas tidak akan tertimpa/overwrite bila dilakukan task symfony build-model ulang.


Sumber referensi yang bisa dibaca:
  1. http://www.symfony-project.org/doctrine/1_2/en/01-Getting-Started
    manual doctrine dari symfony framwork
  2. http://www.doctrine-project.org/documentation/manual/1_0/en
    manual doctrine

2 comments:

  1. mas dendie....

    setelah saya run -> php symfony doctrine:build-schema frontend tampil message error "there is no open connection"

    Kesalahan dimana? Trims

    ReplyDelete
  2. Mungkin terjadi kesalahan format (seperti tidak boleh menggunan tab) atau strukutr YAML dalam menuliskan format YAML di file database.yml.

    Checkidot gan.. mungkin membantu ->
    http://oldforum.symfony-project.org/index.php/m/66514/

    ReplyDelete