[CI Day 7] ปรับเปลี่ยนเส้นทางได้อย่างใจด้วย Route

หายไปนานเหมือนกันเลยรอบนี้ เนื่องจากปัญหาทางด้านสุขภาพนิดหน่อย ช่วงนี้เป็นหวัดงอมเลยครับ พอหลังจากปีใหม่ก็ โทรมมายาวเลย แต่กลัวเนื้อหามันจะขาดช่วงไป ยังไงวันนี้ก็ฝืนสังขาร มาอัพเดทกันซะหน่อยแล้วกัน

ก่อนอื่นผมขออธิบาย เรื่อง Route ของ Framework กันซะก่อน ไม่เพียงแต่เฉพาะ CI โดยหลักแล้วการแสดงผล URL ที่แท้จริงของ Framework นั้นจะเป็นในลักษณะนี้ครับ

  1. http://www.domain.com/index.php/controller/method/argv1/argv2

จะสังเกตุได้ว่า ทุกอย่างจะโดน Process ผ่านไฟล์เดียวคือ index.php นั่นเอง ซึ่ง Software หลายๆ ตัวก็มักจะใช้วิธีนี้ เช่น WordPress ที่ผมกำลังใช้เขียนบทความอยู่นี้ก็ด้วย

ดังนั้นหลังจากเรา Rewrite url ด้วย .htaccess เอา index.php ออกไป เราก็จะได้ url ที่สวยงามเป็น

  1. http://www.domain.com/controller/method/argv1/argv2

ทีนี้ถ้าเราอยากจะทำ Rewrite url ต่อล่ะ ทำไง? ไปเขียนใน .htaccess ต่อเหรอ

คำตอบคือ “ไม่ใช่”

Framework ทุกตัว มักจะมีส่วนการแก้ไข route ที่เป็นเส้นทางในการวิ่งของ url มาให้แล้ว รวมถึง CI เราลองมาดูกันว่าจะทำยังไงกันได้บ้าง

สมมุติ ผมเขียน application จำพวก blog, shop ที่ user สามารถเข้ามาเปิดร้านเอง url มันก็ควรจะเป็น

  1. http://www.domain.com/~username/

(เดี๋ยวจะบอกว่าทำไมต้องมี ~ ด้วย)

ใช่มั้ยล่ะครับ แต่เนื่องจาก CI มันจะมอง segment ที่ 1 เป็น Controller ไปซะฉิบ ทีนี้ทำไงดี?

เราก็แก้ปัญหาโดยการใช้ route ของ CI โดยเข้าไปที่ไฟล์

  1. /application/config/routes.php

แล้วเพิ่มตามตัวอย่างข้างล่างเข้าไปที่ ไฟล์

  1. $route[‘~(.*)/([a-zA-Z0-9]+)(/.*)’] = ‘userapp/$2/$1′;
  2. $route[‘~(.*)’] = ‘userapp/index/$1′;

จากนั้นไปสร้าง Controller ที่มีชื่อว่า userapp.php ขึ้นมาแล้วเขียนลงไปตามนี้

  1. <?php
  2. class Userapp extends Controller {
  3.  
  4.         function __construct()
  5.         {
  6.                 parent::Controller();
  7.         }
  8.  
  9.         function index($user)
  10.         {
  11.                 echo $user;
  12.         }
  13.  
  14.         function method($user)
  15.         {
  16.                 echo "method: ".$user;
  17.         }
  18.  
  19. }
  20. ?>

ที่นี้ลองมารันดู ตามตัวอย่าง

  1. http://localhost/CodeIgniter/~tee
  2. http://localhost/CodeIgniter/~tee/method/ssss

ก็จะได้ผลลัพธ์คือ อันแรก ก็จะเข้า method:index โดยอัตโนมัติ
ส่วนอันที่ 2 ก็จะเข้า method:method

ถ้าอยากได้ค่้า ssss เราก็จะ get ออกมาโดยใช้
$this->uri->segment(3) นั่นเอง

ส่วนที่จำเป็นต้องมี ~ เพราะว่า เราไม่รู้ว่า user จะใช้ชื่ออะไร จึงจำเป็นต้องมี prefix ตัวนึงมาบอกครับ ว่าถ้ามีเครื่องหมายแบบนี้ จะให้เป็นการทำงานของหน้า user

นี่ล่ะครับ Concept ของ Route แต่ว่า ผมบอกไว้ก่อนเลย วิธีนี้ “ไม่เนียน” ครับ ซึ่งการทำ application แบบ open service มันจะต้องได้รูปของ url ที่ดีกว่านี้ เช่น

  1. http://username.domain.com หรือ http://domain.com/username

ไม่ใช่มีตัว ~ มาด้วย ที่เขียนวันนี้ เพราะต้องการให้เข้าใจ concept ของการใช้งาน route เท่านั้น ซึ่งคราวหน้าผมจะมาบอกเรื่องการ hack core ของ route โดยการ extends เข้ามาแก้ไข ทีนี้เราอยากให้ url เป็นยังไง ก็เหมือนเสกได้ตามใจนึกล่ะครับ (ก็เล่นเข้ามาถึง core เลย นี่) ยังไงรอติดตามกันนะครับ กับบทความหน้า

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

1 Comment »

 
 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>