ข้ามไปยังเนื้อหา

Router

การทำงานและกฏของ Router

\Somtum\Router

ทำหน้าที่ในการตัดสินใจว่าจะเรียกคลาสใดมาทำงาน เราสามารถกำหนดกฏของ Router ได้ที่ Class \Somtum\Router ที่ตัวแปร $rules ซึ่งค่าเริ่มต้นจะรองรับ URL รูปแบบดังต่อไปนี้

  • /index.php/Index/Model/Test/page จะถูกเรียกไปยัง \Index\Test\Model::page หรือไฟล์ /Modules/Index/Models/Test.php เมธอด page
  • /print.php/Css/View/Index จะถูกเรียกไปยัง \Css\Index\View::index หรือไฟล์ /Modules/Css/Views/Index.php เมธอด index
  • /index/model/updateprofile.php จะถูกเรียกไปยัง \Index\Updateprofile\Model หรือไฟล์ /Modules/Index/Models/Updateprofile.php เมธอด index
  • /index.php/Alias/Model/Admin/Settings/save จะถูกเรียกไปยัง \Alias\Admin\Settings\Model หรือไฟล์ /Modules/Alias/Models/Admin/Settings.php เมธอด save
  • /module.html จะถูกเรียกไปยัง Default Controller หรือ \Index\Index\Controller หรือไฟล์ /Modules/Index/Controllers/Index.php เมธอด index
  • /index.php?module=home จะถูกเรียกไปยัง Default Controller หรือ \Index\Index\Controller หรือไฟล์ /Modules/Index/Controllers/Index.php เมธอด index
  • /index.php?module=index/mvc จะถูกเรียกไปยัง Default Controller หรือ \Index\Mvc\Controller หรือไฟล์ /Modules/Index/Controllers/Mvc.php เมธอด index

แนวคิดของ Router คือการจับคู่ pattern เข้ากับตัวแปรแอเรย์ ถ้าถูกต้องตามกฏที่กำหนดไว้ ก็จะส่งค่าไปยังตัวแปรต่างที่ระบุไว้ ให้ Router นำไปแปลงเป็นชื่อคลาสอีกที ซึ่งข้อดีของวิธีนี้ ทำให้เราไม่ต้องกังวลเกี่ยวกับการสร้างกฏทีละอันด้วยตัวเอง ซึ่งหากใช้กฏตามมาตรฐานแล้ว เพียงแค่เราสร้างคลาสให้สัมพันธฺกับ URL ตามกฏ ก็จะสามารถเรียกใช้คลาสนั้นๆได้ทันที แถมกฏของ Router ยังเป็นด่านความปลอดภัยขั้นต้นในการเรียกใช้คลาสที่ไม่เหมาะสมได้อีกด้วย

'/^[a-z0-9]+\.php\/([a-z]+)\/(model|controller|view)(\/([\/a-z0-9_]+)\/([a-z0-9_]+))?$/i' => array('module', '_mvc', '', '_dir', '_method'),
  • ([a-z]+) จะจับคู่กับ module เป็นชื่อของโมดูล หรือ ไดเร็คทอรี่ /Modules/Index/ (Index คือ ชื่อโมดูล)
  • (model|controller|view) จะจับคู่กับ _mvc สำหรับระบุว่าเป็น Model View หรือ Controller หรือ ไดเร็คทอรี่ /Modules/Index/Models/ หากเป็น Model
  • ([\/a-z0-9_]+) จะจับคู่กับ _dir เป็นชื่อไฟล์รวมไดเร็คทอรี่ (ถ้ามี) เช่น /Modules/Index/Models/Admin/Settings.php หรือคลาส \Index\Admin\Settings\Model
  • ([a-z0-9_]+) จะจับคู่กับ _method เป็นชื่อเมธอดที่ต้องการเรียก ถ้าไม่พบว่ามีการระบุเมธอดที่ต้องการมาจะเป็นการเรียกไปยังเมธอด index แทน
    หมายเหตุ หากไม่มีการระบุเมธอดมาจะเป็นการใช้กฏที่สองแทน
    '/([a-z]+)\/(model|controller|view)\/([a-z0-9_]+)/i' => array('module', '_mvc', '_dir'),

ในกรณีที่ต้องการกำหนดกฏของ Router เอง สามารถทำได้โดยการสร้างคลาสของ Router ขึ้นมาใหม่สืบทอดจากคลาส \Somtum\Router แล้วกำหนดกฎที่ต้องการลงในตัวแปร $rules (ควรมีการกำหนดกฏเดิมลงในตัวแปรด้วย) แล้วทำการกำหนดค่าให้กับ $app ก่อนการ run

$app = Somtum::createWebApplication();
$app->defaultRouter = '\Me\Router';
$app->run();

ค่ากำหนดของแอพพลิเคชั่น

โปรแกรมทุกตัวมันก็ต้องมีการตั้งค่ากันบ้าง ซึ่งนอกจากค่าติดตั้งเริ่มต้นใน \Somtum\Config แล้ว เรายังสามารถกำหนดค่าเพิ่มเติมได้ที่ /settings/config.php อีก

<?php

return array(
  // template ที่กำลังใช้งานอยู่
  'skin' => 'default',
  // title, description
  'web_title' => 'Somtum',
  'web_description' => 'PHP Micro Framework',
);

โดยที่ค่าติดตั้งนี้ จะไปแทนที่ค่าติดตั้งที่กำหนดใน \Somtum\Config และสามารถเรียกใช้ได้ในทุกคลาสที่สืบทอดมาจาก \Somtum\Base ที่ตัวแปร $cfg เช่น

class Me extends \Somtum\Base
{
  public function index()
  {
    echo self::$cfg->web_title; // แสดง Somtum
    echo self::$cfg->timezone; // แสดง Asia/Bangkok (ค่าติดตั้งนี้อยู่ใน \Somtum\Config)
  }
}

จะเห็นว่า Somtum เป็น Framework ที่มีความซับซ้อนต่ำมาก ซึ่งเป็นสาเหตุหลักที่ทำให้มันเป็น Framework ที่โหลดได้รวดเร็ว และยังสามารถสร้างแอพพลิเคชั่นในรูปแบบ MVC ได้ง่ายๆอีกด้วย สำหรับคนที่ไม่มีพื้นฐาน Framework ยังสามารถใช้ Somtum ในการเรียนรู้ เพื่อที่จะต่อยอดไปยัง Framework อื่นๆที่ตัวเองสนใจได้อีกด้วย หรือแม้กระทั่งการนำ Somtum ไปพัฒนา Framework เพิ่มเติม เพื่อใช้งานส่วนตัวก็ยังได้ เช่น Kotchasan Framework ก็มีแกนของระบบในรูปแบบเดียวกันกับ Somtum เช่นกัน

นอกจากนี้ หากต้องการใช้ Somtum ในการสร้างแอพพลิเคชั่นขึ้นใช้งานได้จริงๆ ก็ยังสามารถทำได้ ยกตัวอย่างเช่น เว็บไซต์นี้ ที่สร้างจาก Somtum Framework

^