php-mvc

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

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

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

วันนี้ ผมจะพามาต่อกันที่ เรื่องของ Controller ซึ่งในทั้ง 2 บทที่ผ่านมา เราได้เห็นไปแล้วว่า  เราทำการ จำแนก Url ออกมาด้วย function parseUrl() เพราะต้องการ แยกให้ชัดเจนว่า อะไรคือ controller และอะไรคือ method

และอาจจะต่อยอดไป จนถึง parameter ที่ตามมาอีกด้วย ว๊าว….

จากนั้น ผมขอทบทวน ย้อนไปถึง บทที่ 2 ซักนิดคือ ภาพนี้

explode param

explode param

จะเห็นว่า home เป็น controller ที่เราสร้างขึ้นมา พร้อมกับ method ที่ชื่อว่า index ตามรูปของไฟล์ด้านล่าง

home controller

home controller

เอาละครับ เท่ากับว่า ในบทที่ 2 เราได้มีการ สร้าง controller กันไปบ้างแล้ว 1 ตัว คือ Home นั้นเอง ทีนี้เราจะมาดู การทำงานในส่วนของ Controller กันครับว่า จะทำอย่างไร ให้ทุกๆ controller นั้น สามารถ เป็นตัวกลาง ระหว่าง model กับ view ได้อย่างลงตัว

ในไฟล์ app.php ของเรา ที่ถือแป็น หัวใจสำคัญ ในการสร้างรากฐานนั้น เราเรียก function parseUrl() ขึ้นมาตั้งแต่ต้น ในส่วนของ __construct() เพื่อให้มันทำงานได้ ในทุกๆ method ที่ทำการ สืบทอดกันต่อไป

เริ่มต้นค้นหาชื่อไฟล์ Controller

ซึ่งเราสามารถดูได้ว่า หลังจากใช้ คำสั่ง FILTER_SANITIZE_URL กับตัวช่วยต่างๆ ตัด domain ออกไปแล้ว ค่าที่เหลือตัวแรก จึงการเป็น controller ไปโดยอัตโนมัติ ดังนั้น เราจะเอา ค่าที่ได้นี้ ไปตรวจสอบ กับไฟล์ ดูว่าใน folder controller มีไฟล์ชื่อที่ตรงกันนี้อยู่ไหม ด้วยวิธีใช้ file_exists ธรรมดา

วิธีสร้าง file_exists

file_exists

ใน code คุณจะเห็นว่า เราทำการ ตรวจสอบว่า controller ที่ป้อนเข้ามาทาง url นั้น (ซึ่งมีค่าเป็นลำดับที่ 0) มีชื่อไฟล์ที่อยู่ใน folder ตรงกันไหม ถ้ามีก็ dump ออกมาดู จะได้ตรงกัน เช่น home แต่ถ้าเรายังไม่ได้สร้าง controller

แต่มีการเรียกเข้ามา ก็จะแสดงค่าเป็น home อยู่ดี เพราะเป็น default controller ที่เรา set เอาไว้ด้านบนสุดนั้นเอง

ทีนี้ หลังจากที่เราทำการเช็คว่า มีไฟล์นี้อยู่จริงหรือไม่ ก็ให้เราทำการ require_once ตัว controller ไฟล์นั้นๆออกมา แต่ให้ทำการ require_once ที่ด้านนอกของ if file_exists เพราะหาก ไม่มีไฟล์นั้นๆ เราก็จะทำการ เรียกค่า default ออกมาแทนนั้นเอง

require_one

require_one

ค่าใน controller เปลี่ยนไป

ทีนี้ ถ้าเรามองดูจะเห็นว่า การที่เราดึงไฟล์ ใหม่เข้ามาแทน home เพราะมันมีการสร้างไว้ก่อนแล้ว เท่ากับว่า ตัวแปรที่ชื่อว่า $this->controller ก็จะต้องเปลี่ยนไปด้วย นั้นทำให้เรา ต้องมาประกาศตัวแปรนี้ใหม่อีกรอบ แทน $url[0] และสร้างเป็น Object แทน array ด้วย

new controller

new controller

และถ้าผมเรียก ด้วย controller อื่นๆ ที่ไม่ใช่ home

Object controller

Object controller

มันก็จะเอา ชื่อ Class ใหม่ของเราไปเก็บไว้แทน

มาต่อกันที่เรื่องของ Method

หลังจากที่เรา จัดการกับต้นทาง อย่างตัว controller เรียบร้อยแล้ว อันดับต่อไป ก็คือเรื่องของ method ที่จะเป็นลำดับที่ 2 ที่ถูกส่งต่อมาผ่านทาง url นั้นเอง

จำได้ไหมครับ ว่าเมื่อกี้นี้ เราใช้งาน $url[0] ไปเพราะมันคือ controller และแน่นอนครับ ดังนั้น method มันก็จะต้องเป็น $url[1] นี่เอง ไม่ใช่ใครอื่น

method_exists

method_exists

เราทำการ ตรวจสอบ method ว่ามีอยู่ใน class นั้นๆหรือไม่ ด้วยการใช้คำสั่ง method_exists แล้วส่งค่า class หรือตัว controller ไป 1 ค่า พร้อมกันกับ method ที่ต้องการ ตรวจสอบนั้นเอง จาก Code ตัวอย่าง ถ้ามี method ที่เรียกตรงกันกับ url ก็จะ dump ค่าออกมา ไม่มีก็ไม่แสดงนะ

home_index

home_index

ถ้าเลื่อน ขึ้นไปดูด้านบน จะเห็นว่า ในตัว controller home ที่ผมสร้างเอาไว้ มีแค่ method ที่ชื่อว่า index อยู่เพียงอย่างเดียว ก็เลยแสดงออกมาได้ จากนั้นเราก็จะ ประกาศค่า method เก็บไว้ใช้งานครับ

unset method

unset method

ลืมบอกไปครับว่า หลังจากที่เรา ประกาศค่าจาก $url ไปแล้วนั้น เราต้องทำการ unset ทิ้งไปด้วยนะครับ เพราะจะทำให้ การรับค่า param ของเรานั้น ไม่ถูกต้อง ซึ่งตรงนี้ต้องย้อนกลับไปทำ ในส่วนของ controller ด้วยนะครับ

มาถึง Parameter กันบ้าง

แน่นอนครับ ว่าหลังจากที่ url ส่งค่ามาเป็น controller , method สุดท้าย เราจะพลักให้ทุกอย่าง หลังจากนี้ กลายไปเป็น parameter ให้หมด ซึ่งก็เท่ากับว่า เราต้องมา set parameter กันต่อ ยังไม่จบง่ายๆ 555

param

param

ตรงนี้คือ เราจะรับค่า ทุกอย่างที่ต่อท้าย method มาเข้าชุด array เพื่อใช้เป็น parameter ในการทำงานต่อไปนั้นเองครับ ถ้าผมลอง dump ออกมาดู จะได้แบบนี้

dump param

dump param

ตอนนี้เราก็จะได้ param มาใช้งาน ในการทำ program ต่างๆกันแล้ว แต่ถ้าจะให้จบ อย่างเหมาะสม เราจะต้องปิดท้ายกันด้วยเรื่องของ การเรียก controller/method/param ครับ จะเรียกได้ อย่างเหมาะสม เราต้องทำงานผ่านทาง

function call_user_func_array() เพื่อที่จะให้เรียกผ่านทาง controller แล้วไล่ไป method เป็นลำดับๆ แล้วค่อยนำ param ไปใช้งาน เท่านี้ก็จะจบสมบูรณ์ครับ

call_user_func_array

call_user_func_array

เท่านี้ก็เป็น อันเรียบร้อยครับ สำหรับ controller ต่อไปนี้เราก็สามารถ สร้าง controller ใหม่ แล้วให้สืบทอด ค่าต่อๆกันไปได้เลย  เดี๋ยวไว้ตอนต่อไป เราจะมาดูเรื่องของ model การบ้างครับ ขอบคุณทุกท่านที่ติดตามนะครับ

Link Series PHP MVC

  1. ตอนที่ 1
  2. ตอนที่ 2