สอน codeigniter ทำ url ให้สั้นและสวยด้วย _remap
สอน codeigniter ทำ url ให้สั้นและสวยด้วย _remap
จุดประสงค์หลักของการทำ Remapping Method Calls หรือการเรียกใช้งานฟังก์ชั่น _remap ใน codeigniter framework ก็เพื่อการนำเอา uri segment ตัวที่ 2 ที่ต่อจากชื่อของ controller นั้น ๆ ไปเปรียบเทียบกับ
รายชื่อเมธอดทั้งหมดใน controller นั้น ๆ ว่ามีอยู่จริงไหม ถ้ามีและตรงกันก็สามารถเรียกใช้งานได้เลย แต่ถ้าไม่มีก็ให้เข้าสู่การทำงานของ default method คือ index นั่นเอง นั่นหมายความว่า การทำ _remap จะทำให้เราสามารถแทรกคำสั่งใด ๆ ก็ได้ ก่อนที่ index ฟังก์ชั่นจะทำงาน
ประโยชน์อีกอย่างหนึ่งของการทำ _remap ใน codeigniter คือเอาไว้จัดการกับ controller ที่ทำงานเกี่ยวกับหมวดหมู่ ยกตัวอย่างเช่น หากเรามี Controller ที่ชื่อว่า Category และมีเมธอดหรือหมวดหมู่ย่อยอยู่ใน Category controller อีกหลายหมวดหมู่ย่อย ลักษณะ url ของเราจะออกมาได้ในลักษณะนี้ คือ
http://localhost/ชื่อคอนโทรลเลอร์/ชื่อเมธอดหลัก/ชื่อหมวดหมู่ย่อยที่เป็นพารามิเตอร์
จาก url ข้างบนเราจะรู้สึกว่ามันยาวเกินไป อยากได้สั้นกว่านี้ เหตุผลก็เพราะว่าเราไม่สามารถส่ง parameter เข้าไปใน default method คือ index ของ codeiginter ได้ เลยจำเป็นต้องสร้างเมธอดขึ้นมเพื่อรับค่าพารามิเตอร์อีกทีหนึ่ง แต่ปัญหานี้จะหมดไปถ้าเราใช้งาน Remapping Method Calls เราจะสามารถใช้งาน url สวย ๆ แบบนี้ได้ทันที
http://localhost/category/sport http://localhost/category/business http://localhost/category/charities http://localhost/category/college .....
วิธีใช้งาน _remap ใน codeigniter
เริ่มต้นง่าย ๆ เลยครับ สร้าง public ฟังก์ชั่นขึ้นมาต่อจาก __construct และอยู่เหนือ index ( จะอยู่ล่างก็ได้ แต่เรียงไว้เพื่อสื่อถึงลำดับการทำงานของฟังก์ชั่น )
public function __construct()
{
parent::__construct();
}
public function _remap($method)
{
}
public function index()
{
$this->load->view('welcome_message');
}
วิธีรับ parameter ร่วมกับ _remap
ในฟังก์ชั่น _remap เราสามารถพิมพ์ชื่อ method และค่าพารามิเตอร์ ส่งและรับค่าเข้ามาได้ในลักษณะดังนี้
public function _remap($method, $params = array())
{
print $method;
print_r($params);
}
ผลลัพธ์เมื่อเราเข้าเว็บไซต์ผ่าน url : http://localhost/welcome/news/11/22/33
news Array ( [0] => 11 [1] => 22 [2] => 33 )
วิธีเปรียบเทียบกับเมธอดใน Controller ผ่าน _remap ฟังก์ชั่น
ในกรณีที่ Controller ของเรามีฟังก์ชั่นหรือเมธอดที่ตรงกับตัวแปร $method ที่ถูกส่สงเข้ามาในฟังก์ชั่น _remap เราสามารถเรียกใช้งานฟังก์ชั่นนั้น ๆ ได้ ผ่านคำสั่ง call_user_func_array โดยสามารถเขียนคำสั่งได้ดังนี้
public function _remap($method, $params = array())
{
if (method_exists($this, $method))
{
return call_user_func_array(array($this, $method), $params);
}else{
$this->index();
}
}
public function index()
{
$this->load->view('welcome_message');
}
public function news(){
$this->load->view('news_view');
}
จากตัวอย่างโค๊ดด้านบน ถ้าเราเข้าเว็บไซต์ผ่าน url : http://localhost/welcome/news/11/22/33 ระบบจะเข้าไปทำงานในฟังก์ชั่น news ทันทีเพราะ $method ที่ส่งเข้ามาใน _remap มีชื่อตรงกัน ในกรณีที่ไม่ตรงก็จะไปทำงานในฟังก์ชั่น index แทน
วิธีประยุกต์ใช้ _remap
ในกรณีที่เราไม่ต้องการสร้าง controller เยอะ และใน controller นั้นก็ไม่อยากให้มีเมธอดเยอะเช่นกัน อยากให้เว็บไซต์มี controller เดียว แต่ไฟล์ html หรือ view เยอะมาก เราสามารถประยุกต์ใช้ _remap ในลักษณะนี้ได้ครับ
public function _remap($method)
{
switch ($method) {
case 'business':
$this->load->view('business');
break;
case 'charities':
$this->load->view('charities');
break;
case 'college':
$this->load->view('college');
break;
default:
$this->index();
}
}