สอน 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(); } }