คู่มือการใช้งาน CodeIgniter เวอร์ชั่น 1.7.2


การกำหนดเส้นทาง URI

แบบปกติแล้วเป็นแบบ 1 ต่อ 1 โดยเป็นความสัมพันธ์ระหว่าง URL ซึ่งสอดคล้องกับ ชื่อคลาส (class) หรือเมธอด (method) ของตัวควบคุม (controller) โดยส่วนต่างๆของ URI จะเป็นตามแบบนี้

example.com/class/function/id/

โดยในบางสิ่งคุณอาจจะอยากเปลี่ยนการเชื่อมความสัมพันธ์ในต่างคลาสหรือฟังก์ชัน โดยสามารถถูกเรียกแทนเพื่อให้สอดคล้องกับ URL ได้

ตัวอย่างเช่น, คุณบอกว่าคุณต้องการต้นแบบ URLs แบบนี้:

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

โดยปกติแล้วส่วนที่สองนั้นเป็น URL สำหรับชื่อฟังก์ชัน แต่ในตัวอย่างมันเป็น ID ของสินค้า ในการที่จะพิชิตสิ่งนี้ CodeIgniter ยอมให้คุณปรับเปลี่ยนการจัดการ URI ได้

กำหนดกฎเส้นทางของคุณเอง

กฎเส้นทางถูกทำไว้ในไฟล์ application/config/routes.php ที่นั้นคุณจะเห็นอาเรย์ที่เรียกว่า $route ซึ่งยินยอมให้คุณกำหนดกฎเกณฑ์ของเส้นทางของคุณเองได้ เส้นทางยังสามารถถูกกำหนดได้ด้วย สัญลักษณ์ตัวแทน(wildcards) หรือ เครื่องหมายธรรมดา(Regular Expressions) อีกด้วย

สัญลักษณ์ตัวแทน(Wildcards)

ตัวอย่างเส้นทางโดยใช้สัญลักษณ์ตัวแทนโดยอาจจะมีลักษณะดังนี้:

$route['product/:num'] = "catalog/product_lookup";

ในเส้นทางในอาเรย์คีย์จะใส่ URI ที่ัจับคู่ไว้ โดยค่าในอาเรย์จะใส่ค่าของเส้นทางที่จะถูกกำหนดเส้นทางไปอีกที ในตัวอย่างด้านบนนั้นถ้ามีคำว่า "product" อยู่ในส่วนที่หนึ่งของ URL และตามด้วยตัวเลขในส่วนที่สอง จะถูกใช้ด้วยคลาส "catalog"และฟังก์ชัน "product_lookup"แทน.

สังเกตุ: ทางด้านซ้ายคือสิ่งที่จะถูกใช้ใน URL จริงและทางด้านขวาคือการบอกเส้นทางเพื่อไปทำงานภายในระบบ (ซึ่งใช้ URL)

คุณสามารถจับคู่ค่าตัวอักษรหรือคุณจะใช้สัญลักษณ์ตัวแทน(wildcard) ทั้งสองนี้ได้:

:num
:any

:num จะจับคู่ในส่วนนั้นเฉพาะเป็นตัวเลขเท่านั้น
:any จะจับคู่ในส่วนเมื่อเป็นอักษรใดๆ (ดังนั้นถ้าไม่ใส่ค่ามาก็จะไม่จับนั้นเอง)

สังเกตุ: เส้นทางจะทำงานตามลำดับที่ถูกสร้างไว้ เส้นทางที่อยู่สูงกว่าจะมีลำดับเหนือกว่าอันที่ต่ำกว่า

ตัวอย่างเช่น

นี้คือบางส่วนของตัวอย่างเส้นทาง

$route['journals'] = "blogs";

URL ที่มีคำว่า "journals" ในส่วนแรกจะถูกเปลี่ยนเส้นทางไปที่คลาส "blogs"

$route['blog/joe'] = "blogs/users/34";

URL ที่มีส่วนเป็น blog/joe จะถูกเปลี่ยนเป็นคลาส "blogs" ฟังก์ชัน "users" และ ID จะมีค่าเป็น "34"

$route['product/:any'] = "catalog/product_lookup";

URL ที่มีคำว่า "product" เป็นส่วนแรกและในส่วนที่สองเป็นอะไรก็ได้จะถูกเปลี่ยนเป็นคลาส "catalog" ฟังก์ชัน "product_lookup"

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

URL ที่มีคำว่า "product" อยู่ในส่วนแรกและตามด้วยตัวเลขใดๆในส่วนที่สองจะถูกเปลี่ยนเป็นคลาส "catalog" และฟังก์ชัน "product_lookup_by_id" โดยผ่านค่าตัวเลขในส่วนที่สองไปยังตัวแปรของฟังก์ชัน ($1 นั้นเอง)

ข้อสำคัญ: อย่าใช้เครื่องหมายสแลช (/) นำหน้าหรือต่อท้าย เช่น "/blog/joe" , "blog/joe/" หรือ "/blog/joe/" ทั้งอาเรย์คีและค่าในอาเรย์

เครื่องหมายธรรมดา(Regular Expressions)

ถ้าคุณต้องการใช้เครื่องหมายธรรมดาเพื่อกำหนดกฎเส้นทาง ซึ่งอันไหนที่ถูกต้องตามเครื่องหมายธรรมดาจะถูกใช้เป็น "back-references"

ข้อสังเกตุ:  ถ้าคุณใช้ "back-references" คุณจะต้องใช้เครื่องหมายดอลลาร์ แทนการใส่ backslash สองตัว (\\)

ตัวอย่างเส้นทางด้วยเครื่องหมายธรรมดาจะหน้าเป็นแบบนี้

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

ในตัวอย่างด้านบน URI เป็น products/shirts/123 จะถูกเรียกแทนเป็นตัวควบคุมคลาส shirts และฟังก์ชัน id_123

คุณยังสามารถรวมระหว่างสัญลักษณ์ตัวแทนและเครื่องหมายธรรมดาได้ (regular expressions)

เส้นทางที่ถูกจอง

มีสองเส้นทางที่ถูกจองไว้:

$route['default_controller'] = 'welcome';

เส้นทางนี้ชี้ทางไปหาคลาสควบคุมตัวไหนจะถูกโหลดขึ้นเมื่อ URI ไม่มีข้อมูลใดๆเลย ซึ่งเป็นกรณีที่คนโหลด URL หน้าแรกของคุณขึ้นมา ตัวอย่างด้านบนคลาส "welcome" จะถูกโหลด คุณต้องมีเส้นทางอัตโนมัตินี้ไม่งั้นหน้า 404 จะประกฎขึ้นแทน

$route['scaffolding_trigger'] = 'scaffolding';

เส้นทางนี้ยอมให้คุณตั้งค่า "คำลับ" ซึ่งเมื่อถูกเขียนลงไปใน URL จะทำให้ใช้คุณสมบัติของโครงยกพื้น(scaffolding) รายละเอียดลองอ่านหน้า Scaffolding (โครงยกพื้น)

ข้อสำคัญ:  เส้นทางที่ถูกจองนี้จะต้องมาก่อนเส้นทางที่มีสัญลักษณ์ตัวแทนหรือเครื่องหมายธรรมดา