php-mvc

วิธีสร้าง PHP Application ด้วยโครงสร้าง MVC ตอนที่ 2

วิธีสร้าง PHP Project ใหม่สำหรับคนที่ต้องการเริ่มต้น อาจจะยังไม่มีพื้น ทางด้านการใช้งาน Framework หรือไม่อยากใช้ความสามารถเต็มที่ของ Framework แต่เราก็ยังสามารถ ทำงานในโครงสร้างแบบ Model View Controller ได้อยู่ดี วันนี้มาต่อกันตอนที่ 2 กับเรื่องของ Routing ครับ

วิธีสร้าง Routing ใน Project MVC

เนื่องจากนี่เป็นยทความ ตอนที่ 2 แล้วนะครับ ต่อจากตอนที่แล้ว ตอนที่ 1 เรื่องของ Structure และ Controller คราวนี้จะเป็นเรื่องของ Routing กันบ้าง เพื่อให้เข้าถึง MVC Project ของเราได้ง่ายขึ้น

อันที่จริงเราได้ ผ่านตาไปบ้างแล้ว สำหรับเรื่องของ Routing เมื่อตอนที่ 1 นั้นก็คือส่วนของ default controller and method ในไฟล์ App.php นั้นเองครับ

วิธีสร้าง default controller

วิธีสร้าง default controller

เท่าที่เขียนมาทั้งหมด ถ้าใครตามไม่ทัน อ่านแล้วยังงงๆ แนะนำให้ ย้อนกลับไปอ่าน หรือค้นเรื่องของ PHP แบบ OOP กันก่อนนะครับ ตรงนี้ใช้พื้นฐานของ OOP เป็นหลัก ในการทำงานเลย

เราจะใช้ class App นี่แหละครับ เป็นตัวกำหนดว่า Routing หรือเวลามีคนกรอก Url มาแบบนี้ จะให้ระบบ พาไปยังส่วนไหน ทีนี้ เนื่องจากว่าเราจะอ้างอิงจาก framework ชื่อดังทั้งหลาย เราเลยทำงานตามแบบนั้นคือ เริ่มจาก Controller แล้วต่อด้วย Method แล้วก็จบด้วย parameter ตัวที่ 1  ตัวที่ 2 ตัวที่ 3 ไปเริ่อยๆ

Url ตัวอย่าง

ตอนนี้ : http://localhost:8000/tutorial/kit/public/

จะเปลี่ยนเป็น http://localhost:8000/tutorial/kit/controller/method/

และเป็นแบบนี้ http://localhost:8000/tutorial/kit/controller/method/param1/param2/

ตอนนี้ถ้าเรา run หน้าเว็บจะได้ตามนี้นะครับ

blank

blank

หน้าเว็บเปล่าๆ ยังไม่มีอะไร

เราจะมาเริ่มบทนี้ด้วย การสร้าง Controller กันครับ เพื่อให้ Routing ทำงานได้ ตามแบบที่เราร่างกันไว้ ผมจะสร้าง Home Controller ขึ้นมาก่อน เพราะว่าผมตั้งชื่อ่า Home เป็นงานแรก โดยเราจำเป็นจะต้อง ให้ทาง Controller ใหม่ที่เราจะสร้างขึ้นมาทุกตัว ทำการ Extends ความสามารถ หรือสืบทอดคุณสมบัติ ออกมาจาก Main Controller หลักที่อยู๋ใน folder core ด้วยนะครับ

home controller

home controller

ตาม Code เลยก็คือ class ชื่อ Home ที่ทำการ สืบทอดคุณสมบัติมาจาก Class ที่ชื่อ Controller แล้วก็ประกาศ function เอาไว้ 2 function คือ 1 __construct() เพื่อใช้งานแบบทุก method และ index() สำหรับเป็นหน้าหลักให้เรา ผมพิมพ์คำว่า “Home/index” เอาไว้เพราะตอนนี้ เรายังไม่มี view เลยแสดงให้ดู จากตรงนี้ก่อน แต่ถ้าใครทำ view แล้วอย่ามาโชว์ข้อความอะไรตรงๆ จากตรงนี้ละ

เท่ากับว่า ตอนนี้เรามีข้อมูล ตรงกับตอนที่เราตั้งค่า Defaullt เอาไว้ใน App.php เรียบร้อยแล้ว ทีนี้ถ้าเราเรียก Home/index เลย ตรงๆผ่านทาง Url จะใช้งานได้เลยไหม อันนีตอบว่า ยังครับ เราต้องไปทำการ สร้าง function สำหรับดึงค่า url ไปใช้อีก โดยผมจะสร้างเป็น function ชื่อ parseUrl() แบบ framework ดังๆเลย

parseurl

parseurl

ตรงนี้ผมทำการ รับค่าจาก Url มาแล้วก็ทำการแสดง echo ออกมาตรงๆ แต่เราต้องเรียกไว้ในส่วนของ construct นะครับ เพื่อให้ทำงานได้

first-url

first-url

อันนี้เป็นข้อความที่เรา ได้ออกมาจาก parseUrl นะครับทีนี้ลองเป็นแบบ ส่งมาพร้อม parameter บ้าง

second-url

second-url

เรียบร้อย เราสามารถรับ controller และ method รวมถึง parameter ตัวอื่นๆได้อย่างถูกต้องแล้ว เดี๋ยวเราจะไปกำหนด สิทธิ์ในการเข้าถึง เหมือนตอนที่ทำให้กับ folder app ครับ แต่คราวนี้เราจะเขียน และกำหนดผ่านทาง public แทนนะ

เราก็จะไปสร้าง ไฟล์ .htaccess อีกแล้ว โดยคราวนี้เราจะกำหนด “เงื่อนไข” เยอะขึ้นมากกว่า โดยเราจะเปิด RewriteEngine แล้วก็ทำการ Rewrite Url ซะ โดยจะปิดชื่อไฟล์ กับเปิดการรับ parameter ตรงนี้ไว้จะมาอธิบายเรื่องการเขียน Rewrite ให้ฟังใหม่แยกแล้วกันนะครับ เพราะมันยาวมาก

htaccess

htaccess

ต่อไปเราจะทำการปรับ Url ให้ถูกต้องแล้วก็ใช้ function FILTER_SANITIZE_URL เพื่อทำการอ่านค่าให้ถูกต้อง แล้วจับมันแยกด้วย explode คั่นตามเครื่องหมาย ” / ” ก็จะได้ Url ที่ถูกต้องออกมา

explode url

explode url

จะเห็นว่า เรารับ Get url มาเหมือนเดิม แต่จับเข้า FILTER_SANITIZE_URL เพื่อเอาชื่อของ URL เว็บเราออกมาจะได้

/home/index/teerapuch/kassakul

จากนั้นตัดข้อความทางขวาออกมาด้วย rtrim($_GET[‘url’],’/’) แล้วเอาทั้งหมดทำการ explode เพื่อเก็บค่าเป็น array ถ้าลอง run คำสั่ง var_dump จะได้ตามภาพนี้

explode param

explode param

ตอนนี้เราจะได้ parameter ที่ถูกต้องคือ ตัวแรกเป็น Controller ตัวที่สองเป็น Method และตัวต่อๆไปคือ param ที่จะใช้ในการทำงานเช่น ID, Name หรืออื่นๆ น่าจะเป็ฯพื้นฐานเบื้องต้นสำหรับ เรื่องของ Routing ได้บ้าง Post นี้ยาวซะอีกแล้ว อยากให้สั้นๆไม่เคยทำได้เลย

ใครที่ติดตามเดี๋ยวคราวต่อไปน่าจะเป็นเรื่องของ Controller นะครับว่า เราจะเอา มาแยกจาก url ให้มันเหมาะสมอยางไร ฝากติดตามกันด้วยครับ