สอน codeigniter ทำ url ให้สั้นและสวยด้วย _remap

php-codeigniter-framework
php-codeigniter-framework

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