[ตอนที่ 8] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลลงฐานข้อมูล
ตอนสุดท้ายนี้จะพูดถึงฝั่ง API ของแชตล้วนๆ ซึ่งโค้ด API ของแชตจะเป็น Model และอยู่ที่ Chat\Index\Model ซึ่งผมจะอธิบายทีละเมธอดนะครับ
อันแรกที่จะพูดถึงคือ API สำหรับร้องขอชื่อที่ใช้ในการสนทนา getUser
Service นี้จะทำหน้าที่ในการตรวจสอบวันใหม่ หากพบว่าการเรียกมายัง Service เป็นวันใหม่ให้ทำการลบข้อมูลการสนทนาก่อนหน้าทั้งหมดออก เสร็จแล้วให้ทำการสุ่มชื่อสมาชิกขึ้นมา ทำการตรวจสอบชื่อสมาชิกกับฐานข้อมูล ซึ่งถ้าชื่อสมาชิกว่างก็จะมีการบันทึกข้อความเข้าร่วมสนทนาลงฐานข้อมูล และส่งกลับชื่อสมาชิกใหม่รูปแบบ JSON กลับไป
ในส่วนของการสนทนา จะมีการส่งข้อมูลการสนทนาไปที่เมธอด send
ที่เมธอดนี้จะทำหน้าที่ในการบันทึกข้อมูลที่ส่งมาใส่ลงในฐานข้อมูลอย่างเดียว ไม่มีการส่งค่ากลับ
สุดท้าย API อีกอันนึงก็คือ API สำหรับอ่านค่าการสนทนา get
API นี้จะถูกติดต่อจาก Client เป็นระยะเพื่อคอยตรวจสอบว่ามีการสนทนาใหม่เข้ามาหรือไม่ โดยที่ Client จะทำการส่งข้อมูลครั้งล่าสุดที่เคยอ่านได้มาพร้อมกับการร้องขอข้อมูลใหม่ ซึ่ง API จะทำการตรวจสอบว่ามีข้อมูลใหม่กว่าอยู่หรือไม่ ถ้ามีก็จะทำการส่งข้อมูลใหม่กลับไป แต่ถ้าไม่มีก็จะเป็นการส่งข้อมูลเปล่าๆกลับไปแทน
ข้อมูลที่ถูกส่งกลับไปจาก API ทั้งหมดจะเป็นข้อมูลดิบจากฐานข้อมูล ส่งกลับในรูปแบบ JSON เท่านั้น เนื่องจากข้อมูลประเภทนี้มี Overhead ต่ำ ซึ่งเมื่อรวมกับประสิทธิภาพของคชสารเองที่มีความเร็วสูง ทำให้การใช้งานในลักษณะนี้ของคชสารมีประสิทธิภาพสูงตามไปด้วย ตลอดจนทั้ง Javascrip และ PHP ก็ยังสามารถใช้งานข้อมูลเหล่านี้ที่ส่งกลับไปได้อย่างง่ายๆ อีกด้วย
อันแรกที่จะพูดถึงคือ API สำหรับร้องขอชื่อที่ใช้ในการสนทนา getUser
public function getUser(Request $request)
{
// ตาราง chat
$table = $this->getTableName('chat');
// ตรวจสอบวันใหม่ และ ลบข้อมูลการทนทนาออกหากเริ่มวันใหม่
if (is_file(ROOT_PATH.DATA_FOLDER.'chat.log')) {
$d = (int)file_get_contents(ROOT_PATH.DATA_FOLDER.'chat.log');
if ($d != (int)date('d')) {
// ลบข้อมูล
$this->db()->emptyTable($table);
}
}
// บันทึกวันนี้เป็นไฟล์
$f = fopen(ROOT_PATH.DATA_FOLDER.'chat.log', 'w');
fwrite($f, (int)date('d'));
fclose($f);
// ตรวจสอบชื่อสมาชิกซ้ำในฐานข้อมูล
while (true) {
$name = 'Guest_'.\Kotchasan\Text::rndname(4, '123456789');
$find = $this->db()->find($table, array('name', $name));
if (!$find) {
break;
}
}
// บันทึกการเข้าห้อง Chat
$this->db()->insert($table, array(
'create_date' => time(),
'name' => $name,
'ip' => $request->getClientIp(),
'message' => 'เข้าร่วมสนทนา'
));
// เตรียมตัวแปรสำหรับส่งค่ากลับ
$result = array('name' => $name);
// คืนค่า output เป็น JSON
$responsre = new Response;
$responsre->withHeader('Content-type', 'application/json')
->withContent(json_encode($result))
->send();
}
Service นี้จะทำหน้าที่ในการตรวจสอบวันใหม่ หากพบว่าการเรียกมายัง Service เป็นวันใหม่ให้ทำการลบข้อมูลการสนทนาก่อนหน้าทั้งหมดออก เสร็จแล้วให้ทำการสุ่มชื่อสมาชิกขึ้นมา ทำการตรวจสอบชื่อสมาชิกกับฐานข้อมูล ซึ่งถ้าชื่อสมาชิกว่างก็จะมีการบันทึกข้อความเข้าร่วมสนทนาลงฐานข้อมูล และส่งกลับชื่อสมาชิกใหม่รูปแบบ JSON กลับไป
ในส่วนของการสนทนา จะมีการส่งข้อมูลการสนทนาไปที่เมธอด send
public function send(Request $request)
{
if ($request->initSession() && $request->isReferer()) {
$save = array(
'create_date' => time(),
'name' => $request->post('name')->topic(),
'message' => $request->post('message')->topic(),
'ip' => $request->getClientIp()
);
$this->db()->insert($this->getTableName('chat'), $save);
}
}
ที่เมธอดนี้จะทำหน้าที่ในการบันทึกข้อมูลที่ส่งมาใส่ลงในฐานข้อมูลอย่างเดียว ไม่มีการส่งค่ากลับ
สุดท้าย API อีกอันนึงก็คือ API สำหรับอ่านค่าการสนทนา get
public function get(Request $request)
{
if ($request->initSession() && $request->isReferer()) {
// ค่าที่ส่งมา
$id = $request->post('id')->toInt();
$name = $request->post('name')->topic();
// เวลาปัจจุบันสำหรับส่งกลับ
$result = array('time' => time());
if ($id == 0) {
// เรียกครั้งแรก
$result['items'][] = array(
'create_date' => $result['time'],
'message' => 'เข้าร่วมสนทนา',
'name' => $name
);
} else {
// query ข้อมูล ถัดจากรายการที่ $id
$query = $this->db->createQuery()
->select()
->from('chat')
->where(array('create_date', '>', $id))
->order('create_date')
->toArray();
foreach ($query->execute() as $item) {
$result['items'][$item['create_date']] = $item;
}
}
// คืนค่า output เป็น JSON
$responsre = new Response;
$responsre->withHeader('Content-type', 'application/json')
->withContent(json_encode($result))
->send();
}
}
API นี้จะถูกติดต่อจาก Client เป็นระยะเพื่อคอยตรวจสอบว่ามีการสนทนาใหม่เข้ามาหรือไม่ โดยที่ Client จะทำการส่งข้อมูลครั้งล่าสุดที่เคยอ่านได้มาพร้อมกับการร้องขอข้อมูลใหม่ ซึ่ง API จะทำการตรวจสอบว่ามีข้อมูลใหม่กว่าอยู่หรือไม่ ถ้ามีก็จะทำการส่งข้อมูลใหม่กลับไป แต่ถ้าไม่มีก็จะเป็นการส่งข้อมูลเปล่าๆกลับไปแทน
ข้อมูลที่ถูกส่งกลับไปจาก API ทั้งหมดจะเป็นข้อมูลดิบจากฐานข้อมูล ส่งกลับในรูปแบบ JSON เท่านั้น เนื่องจากข้อมูลประเภทนี้มี Overhead ต่ำ ซึ่งเมื่อรวมกับประสิทธิภาพของคชสารเองที่มีความเร็วสูง ทำให้การใช้งานในลักษณะนี้ของคชสารมีประสิทธิภาพสูงตามไปด้วย ตลอดจนทั้ง Javascrip และ PHP ก็ยังสามารถใช้งานข้อมูลเหล่านี้ที่ส่งกลับไปได้อย่างง่ายๆ อีกด้วย