[ตอนที่ 8] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลลงฐานข้อมูล

ตอนสุดท้ายนี้จะพูดถึงฝั่ง API ของแชตล้วนๆ ซึ่งโค้ด API ของแชตจะเป็น Model และอยู่ที่ Chat\Index\Model ซึ่งผมจะอธิบายทีละเมธอดนะครับ

อันแรกที่จะพูดถึงคือ 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 ก็ยังสามารถใช้งานข้อมูลเหล่านี้ที่ส่งกลับไปได้อย่างง่ายๆ อีกด้วย
0SHAREFacebookLINE it!