Monday, May 11, 2015

Web Service PHP Menggunakan Slim Framework : Membuat Web Service (Read dan Insert ke Database)

UPDATE
Terdapat bug pada tutorial ini, ketika  tabel memiliki foreign key NotORM tidak dapat melakukan select dengan benar. Saya sarankan untuk menggunakan PHP (tanpa library ORM) untuk melakukan CRUD.

Pada postingan sebelumnya saya menuliskan tentang instalasi Slim Framework. Kali ini akan saya lanjutkan dengan tutorial pembuatan web service sederhana menggunakan Slim Framework dan library NotORM.

Sebelumnya, perlu dipahami
Slim Framework --> Micro framework PHP untuk membuat rest web service.
NotORM --> Library PHP untuk mengolah data yang ada di database. Penggunaan library ini untuk membuat web service sebenarnya bukan sesuatu yang wajib, namun akan mempermudah coding daripada harus menuliskan query MySQL lewat code PHP langsung. Bisa juga menggunakan library ORM lainnya selain NotORM.


Sebagai informasi, sistem yang saya gunakan adaah sebagai berikut
Sistem operasi : archlinux 64 bit
Apache 2.4.12
PHP 5.6.8
MySQL 5.6.24

Sebelum membuat web service, perlu dilakukan konfigurasi terhadap PHP.
Yang perlu dilakukan adalah mengaktifkan extension pdo_mysql karena library NotORM terhubung ke MySQL lewat driver PDO (PHP Data Object).
Untuk mengaktifkan pdo_mysql adalah sebagai berikut
1. Edit /etc/php/php.ini (kalau pakai Windows silakan dicari sendiri di mana letak file php.ini)
2. Cari baris ;extension=pdo_mysql.so
3. Hilangkan tanda ; di depan extension=pdo_mysql.so sehingga menjadi extension=pdo_mysql.so
pdo_mysql
4. Simpan file /etc/php/php.ini, selanjutnya restart apache

Baiklah, langkah-langkah pembuatan web service sederhana menggunakan Slim Framework adalah sebagai berikut
1. Buat database MySQL dengan nama booksdb, berikut ini adalah file dump database yang berisi structure dan beberapa record tabel. Silakan diimport untuk mendapatkan databasenya.
-- phpMyAdmin SQL Dump
-- version 4.4.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: May 10, 2015 at 11:11 PM
-- Server version: 5.6.24
-- PHP Version: 5.6.8

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `booksdb`
--

-- --------------------------------------------------------

--
-- Table structure for table `books`
--

CREATE TABLE IF NOT EXISTS `books` (
  `id` int(10) unsigned NOT NULL,
  `title` varchar(50) NOT NULL,
  `author` varchar(50) NOT NULL,
  `summary` text
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

--
-- Dumping data for table `books`
--

INSERT INTO `books` (`id`, `title`, `author`, `summary`) VALUES
(1, 'Three Musketeers', 'Alexander Dumas', 'Three Musketeers'),
(2, 'Meditations', 'Marcus', 'Meditations'),
(3, 'kambing jantan', 'raditya dika', 'no comment');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `books`
--
ALTER TABLE `books`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `books`
--
ALTER TABLE `books`
  MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

2. Download Slim Framework dari http://www.slimframework.com/, kemudian ekstrak ke folder htdocs
3. Download NotORM dari http://www.notorm.com/, kemudian ekstrak ke folder htdocs
4. Buat file slim_crud.php (nama file bisa diganti sesuai kebutuhan) untuk membangun web service, letakkan sejajar dengan folder hasil kompresi Slim Framework dan NotORM.
htdocs

Mari kita buat  file slim_crud.php
Load dulu  Slim Framework dan NotORM
<?php
require 'notorm-master/NotORM.php'; //lod library NotORM
require 'Slim-2.6.2/Slim/Slim.php'; //load Slim Framework

Selanjutnya inisialisasi Slim
$app = new \Slim\Slim(array(
 "MODE" => "development",
    "TEMPLATES.PATH" => "./templates"
));

Deklarasikan koneksi  database melalui NotORM
//deklarasi koneksi database melalui library NotORM
$dsn = "mysql:dbname=booksdb;host=localhost";
$username = "[user_mysql]"; //masukkan nama user mysql
$password = "[password_mysql]"; //masukkan password user mysql
$pdo = new PDO($dsn, $username, $password);
$db = new NotORM($pdo);

Kemudian buat route, yang pertama adalah /
Jadi nanti ketika alamatweb/slim_crud.php dipanggil, yang dieksekusi adalah fungsi berikut
//hit parent URL
$app->get("/", function() {
    echo "<h1>Hello Slim World</h1>";
});

Kemudian route /books yang akan diakses dengan method GET, nanti bisa diambil seluruh record di dalam tabel dengan output berbentuk JSON.
//hit URL /books, method GET
//mengambil seluruh isi tabel books dari database
$app->get("/books", function () use ($app, $db) {
    $books = array();
    foreach ($db->books() as $book) {
        $books[]  = array(
            "id" => $book["id"],
            "title" => $book["title"],
            "author" => $book["author"],
            "summary" => $book["summary"]
        );
    }
    $app->response()->header("Content-Type", "application/json");
    echo json_encode($books);
});

Kemudian /books/{id_buku}, lewat route ini bisa dilakukan pencarian buku berdasarkan id menggunakan method GET.
//hit URL /books/{id_buku}, method GET
//mengambil buku tertentu sesuai id bukunya dari database
$app->get("/book/:id", function ($id) use ($app, $db) {
    $app->response()->header("Content-Type", "application/json");
    $book = $db->books()->where("id", $id);
    if ($data = $book->fetch()) {
        echo json_encode(array(
            "id" => $data["id"],
            "title" => $data["title"],
            "author" => $data["author"],
            "summary" => $data["summary"]
            ));
    }
    else{
        echo json_encode(array(
            "status" => false,
            "message" => "Book ID $id does not exist"
            ));
    }
});

Tambahkan route /books, nanti akan digunakan untuk menambah data buku menggunakan method POST.
//hit URL /book, method POST
//menambahkan buku baru ke database
$app->post("/book", function () use($app, $db) {
    $app->response()->header("Content-Type", "application/json");
    $book = $app->request()->post();
    $result = $db->books->insert($book);
    echo json_encode(array("id" => $result["id"]));
});

Terakhir tambahkan
$app->run();

Berikut ini adalah isi lengkap dari file slim_crud.php
<?php
require 'notorm-master/NotORM.php'; //lod library NotORM
require 'Slim-2.6.2/Slim/Slim.php'; //load Slim Framework
\Slim\Slim::registerAutoloader();
 
$app = new \Slim\Slim(array(
 "MODE" => "development",
    "TEMPLATES.PATH" => "./templates"
));

//deklarasi koneksi database melalui library NotORM
$dsn = "mysql:dbname=booksdb;host=localhost";
$username = "[user_mysql]"; //masukkan nama user mysql
$password = "[password_mysql]"; //masukkan password user mysql
$pdo = new PDO($dsn, $username, $password);
$db = new NotORM($pdo);

//hit parent URL
$app->get("/", function() {
    echo "<h1>Hello Slim World</h1>";
});

//hit URL /books, method GET
//mengambil seluruh isi tabel books dari database
$app->get("/books", function () use ($app, $db) {
    $books = array();
    foreach ($db->books() as $book) {
        $books[]  = array(
            "id" => $book["id"],
            "title" => $book["title"],
            "author" => $book["author"],
            "summary" => $book["summary"]
        );
    }
    $app->response()->header("Content-Type", "application/json");
    echo json_encode($books);
});

//hit URL /books/{id_buku}, method GET
//mengambil buku tertentu sesuai id bukunya dari database
$app->get("/book/:id", function ($id) use ($app, $db) {
    $app->response()->header("Content-Type", "application/json");
    $book = $db->books()->where("id", $id);
    if ($data = $book->fetch()) {
        echo json_encode(array(
            "id" => $data["id"],
            "title" => $data["title"],
            "author" => $data["author"],
            "summary" => $data["summary"]
            ));
    }
    else{
        echo json_encode(array(
            "status" => false,
            "message" => "Book ID $id does not exist"
            ));
    }
});

//hit URL /book, method POST
//menambahkan buku baru ke database
$app->post("/book", function () use($app, $db) {
    $app->response()->header("Content-Type", "application/json");
    $book = $app->request()->post();
    $result = $db->books->insert($book);
    echo json_encode(array("id" => $result["id"]));
});

$app->run();

Langkah selanjutnya adalah mengakses web service.
Untuk route dengan method GET, dapat langsung diakses melalui web browser.
1. Akses file slim_crud.php dari web browser, misal kalau di tempat saya alamatnya adalah http://localhost/slim_latihan/slim_crud.php, hasilnya adalah sebgai berikut
parent
2. Ambil semua data buku dari tabel, buka slim_crud.php/books
books

3. Ambil data buku dengan id = 3, buka slim_crud.php/book/3
3book

4. Menambahkan buku baru ke database. Untuk keperluan ini tidak bisa langsung dilakukan dengan membuka alamat URL melalui web browser karena menambahkan buku menggunakan method POST, harus diinstall plugin web service client.
Untuk keperluan ini saya menggunakan addon RESTClient di Firefox
rest_client

Nah misalkan ingin menambahkan buku dengan
id = 4
title = judul buku
author = penulis
summary = no summary
*keterangan : field-field yang ditambahkan ini sesuai dengan field tabel buku di database ya

Data di atas kita ubah ke bentuk URL encoded sebagai berikut
id=4&title=judul+buku&author=penulis&summary=no+summary

Buka RESTClient, kemudian masukkan alamat php ya ke URL
misal
http://localhost/slim_latihan/slim_crud.php/book
kemudian pilih method POST
tambahkan Headers :
Content-Type
application/x-www-form-urlencoded

restCLient

kemudian masukkan URL encoded yang berisi data buku yang akan diinsert tadi sebagai Body
hitWs

selanjutnya klik tombol SEND

apabila buku berhasil diinsert, akan muncul id buku di bagian Response
response

Demikian tutorial kali ini.
Source code yang digunakan pada tutorial ini diambil dari http://www.sitepoint.com/writing-a-restful-web-service-with-slim/

1 comments:

Anonymous said...

Saya php versi 5.3.1.. apa versi dari php, apache, dan mysql sendiri mempengaruhi? udah dicoba gagal terus,, sebelumnya makasih atas artikelnya sangat bermanfaat ^^

Post a Comment

ardhi.web.id. Powered by Blogger.