mvc php

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

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

วิธีสร้าง Model View Controller Project

สำหรับคนที่เริ่มต้น หัดเขียนเว็บไซต์ด้วยภาษา PHP ส่วนใหญ่เลย เกือบร้อยทั้งร้อย มักจะเริ่มจากการเขียนแบบ บรรทัดบนสุด ไล่ลงมาเรื่อยๆ หรือที่เราเรียกกันว่า Procedural ถ้ามีความสามารถเพิ่มขึ้นมาหน่อย ก็จะไต่ไปในรูปแบบ OOP แล้วจากนั้นก็เข้าสู่ วังวนของ MVC

MVC คืออะไร

ทีนี้อะไรคือ MVC ตรงนี้เป็นเรื่องที่ต้องทำความเข้าใจกันก่อน MVC ย่อมาจากคำว่า Model, View และ Controller ผมจะอธิบายแบบบ้านๆนะครับจะได้เข้าใจง่ายๆ  MVC เป็นเรื่องของ Patterns ซึ่งมีไว้เพื่อออกแบบระบบการเขียนโปรแกรมให้สามารถนำมาเป็นแนวทางในการแก้ไขปัญหาต่างได้ ซึ่งมีมากมายหลายแบบ แต่เราจะพูดแค่เรื่องของ MVC เพียงอย่างเดียวใน Post นี้ อ่านเพิ่มเติมได้จาก PHP ทำความรู้จักกับ MVC กันก่อน

หลายๆคนที่ทำเว็บกันมาบ้างแล้ว คงจะชินกับเรื่องของ Structure แบบเดิมๆแต่คราวนี้เราจะเปลี่ยนจากแบบเดิม มาเป็นให้ Controller ทำการควบคุมการทำงานของ Code Logic แล้วให้ Model ติดต่อกับฐานข้อมูลก่อนทั้งหมดจะส่งค่าออกไปให้กับ View ในส่วนติดต่อกับผู้ใช้งาน ถ้าผมมีหลายคนทำงาน ตรงวิวจะให้ front end ทำงานนะครับ

Structure Project

ก่อนอื่นเราต้องเริ่มจากเรื่องของ การออกแบบไฟล์ กับ Folder กันก่อน เพราะถ้าเป็นแบบเดิม เราก็แค่ วางทุกไฟล์ลงไปใน folder ที่ใช้สำหรับ Run งาน แต่ตอนนี้เราจะออกแบบให้เป็นรูปแบบของ MVC ดังนั้นมันจะมีการอ้างอิง โครงสร้างและไฟล์ต่างๆ สำหรับตั้งต้น มาดูกันครับ

ขอแยกแบบง่ายๆไว้ก่อน 2 Folder คือ 1.app 2.public

วิธีสร้าง folder

folder

ในทั้ง 2 folder จะมีความแตกต่างกันคือ

1.app จะสร้างขึ้นมาสำหรับเก็บไฟล์ ที่ใช้ในการเขียน Code ระบบของเราทั้งหมด ไฟล์ php ทั้งหมด
2.public จะสร้างขึ้นมาสำหรับเก็บไฟล์ ที่สามารถให้ผู้ใช้งานจากภายนอกสามารถเข้าถึงได้เช่น CSS, Javascript, image

ต่อไปก็จะเป็นการสร้าง Folder mvc ใน app นะครับ

mvc folder

MVC folder

ในภาพจะเห็นว่า ผมสร้าง folder ขึ้นมา 4 อันคือ controller, model, views และ core ซึ่ง folder core นี้สร้างขึ้นมาเพื่อใช้งานไว้สำหรับเก็บไฟล์ของระบบ เพื่อให้ controller, model และ view สามารถติดต่อกันได้นั้นเอง

ส่วนใน folder public ก็จะสร้าง folder สำหรับจัดการกับ css, js และไฟล์รูปภาพ

public folder

public folder

มาเริ่ม Coding กันเลยดีกว่า

ต่อไปก็เริ่มด้วย การสร้าง Code สำหรับเป็นศูนย์ควบคุม ความเชื่อมโยงกันของทั้ง 3 สมาชิกนั้นเอง โดยผมจะสร้างเป็นไฟล์ชื่อ App.php ขึ้นมา สำหรับทำงาน

Code ในไฟล์ App.php

Code ในไฟล์ App.php

ในส่วนของไฟล์ App.php ผมทำการสร้าง class ชื่อ App ขึ้นมา โดยทำการสร้าง public function อย่าง __construct() เปล่าๆขึ้น เพื่อให้ใช้งานได้หมดทั้งไฟล์ กับการประกาศตัวแปร ขึ้นมาใหม่ 3 ค่าเป็นแบบ protected คือ

  1. $controller สำหรับเก็บค่า home ซึ่งจะให้เป็น controller หลักแบบ default
  2. $method สำหรับเก็บค่า index ซึ่งจะเป็นค่า method แรกที่ถูกเรียกต่อจาก controller
  3. $params สำหรับเก็บค่า array ซึ่งจะเอาไว้ใช้เวลา user ส่งค่ามาผ่านทาง url

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

จากนั้นเราจะไปทำการสร้างไฟล์ชื่อ Controller.php เก็บไว้ใน folder core เหมือนเดิม ซึ่งจะใช้งานเป็น Controller หลักของระบบ ให้ Controller ตัวอื่นๆ ที่เราจะสร้างขึ้นใหม่ ทำการสืบทอดค่าออกไปต่อๆกันนั้นเอง

Code ในไฟล์ Controller.php

Code ในไฟล์ Controller.php

ผมสร้าง Class Controller เปล่าๆขึ้นมา พร้อมทั้ง funciton __construct() เหมือนเดิม แต่ยังไม่ใส่ Code อะไรเข้าไปนะครับ ค่อยๆไปกัน เพระาเรื่องนี้ยาวแน่ๆ แต่อยากให้เข้าใจ โครงสร้างแบบนี้ไว้ เวลาไปใช้งาน framework จะได้ไม่งง และใช้งานได้เต็มที่ เต็มประสิทธิภาพนะครับ

จากนั้นเราจำเป็นต้องมีไฟล์ 1 ไฟล์ วางไว้ด้านนอก folder app สำหรับเป็นเหมือนการตั้งต้นระบบ หรือที่เราเคยได้ยินในชื่อ bootstrap ประมาณนั้นอ่ะครับ ซึ่งจะมีหน้าที่ ดึงไฟล์ที่เราสร้างไว้เมื่อกี้ขึ้นมานั้นเอง

Code ในไฟล์ init.php

Code ในไฟล์ init.php

ในไฟล์ init.php นี่เราทำการ ดึงไฟล์หลักของระบบเข้ามาเพื่อให้ ทำงานได้เลยแบบอัตโนมัติ แต่มันจะยังไม่สามารถทำงานได้ เพระว่า ถ้าเรารันระบบตอนนี้ ใน user จะถูกพาไปยัง folder public เปล่าๆอยู่เหมือนเดิม

รูปภาพเมื่อเข้าระบบตอนนี้ blank public

รูปภาพเมื่อเข้าระบบตอนนี้ blank public

งั้นเราจะต้องมาสร้าง ไฟล์ index ใน public ด้วยครับเพื่อให้เรียกใช้งาน ระบบของเราทั้งหมดใน Core ทันทีที่มีผู้เข้าใช้งาน

Code ในไฟล์ index folder public

Code ในไฟล์ index folder public

เราทำการ เรียกใช้งานไฟล์ init.php เข้ามาที่บรรทัดบนสุดนะครับ แล้วหลังจากนั้นผมก็ประกาศ Object จาก Class ที่ชื่อ App ที่อยู่ในไฟล์ core/app.php นั้นแหละครับ เพื่อให้เรียกใช้งาน function และ method ต่างๆทั้งหมดได้

ทีนี้ หากเราจบเอาไว้เพียงแค่โครงสร้างแบบนี้ เวลาที่ user เรียกใช้งานผ่านทาง Path Url ตรงๆเช่น localhost/project/app/ ทุกคนก็จะสามารถเข้ามาถึง โครงสร้างของไฟล์แบบนี้ได้เลย

ภาพเวลา run url directory app

ภาพเวลา run url directory app

ซึ่งโดยปรกติแล้ว เราจะไม่อนุญาติให้ใคร เข้าถึงระบบ ภายใน Folder App ของเรา ได้โดยตรงแบบนี้ (ใครที่เคยใช้ Framework  มาบ้างคงจะคุ้นกันดี) ทีนี้ เราเลยต้องทำการ กำหนดสิทธิในการเข้าถึง folder และไฟล์ นี้เสียไหม ทำได้โดยการ โยนทุกคนมาที่ Index ซึ่งโดยหากเราไม่ทำไว้ใน App มันก็จะแจ้ง Error 500 ออกมาแทน

การกำหนดสิทธิ์นี้ เราจะใช้ความสามารถเล็กน้อยของ Apache ที่ทำหน้าแสนดีเป็น Web Server ให้ระบบเรา นั้นคือ .htaccess โดยเราจะเริ่มจากการ กำหนเค่าให้ option ง่ายๆก่อน แต่เดี๋ยวคงมีได้ใช้อีก ค่อยไปว่ากัน

htaccess-in-app

htaccess-in-app

เขียนแค่นี้ครับ แล้ว Save ใส่ลงไปใน folder App ตรงๆได้เลย เท่ากับว่า ตอนนี้เราจะไม่สามารถเข้าไปใน folder app ตรงๆได้แล้ว มาลองดูกัน

server error

server error

สิ่งได้ออกมาคือ Server Error 500 ซึ่งบอกว่าไม่สามารถเข้าไปต่อได้ แต่ก็ยังไม่พบ Index นั้นเอง ตอนนี้ทุกคนจะมี Folder และไฟล์ทั้งหมด ตามภาพนี้แล้วนะครับ

all

all

ไม่ต้องไปนับ folder git นะครับ อันนั้นผมทำไว้จะได้เขียนต่อให้จบ ตอนนี้เราสามารถ เข้าระบบได้ผ่านทาง Public แต่ยังไม่มีอะไร ยังคง Blank อยู่ แต่ผมว่ามันยาวมากแล้ว จะขอมาต่อเป็นตอนต่อไปในส่วนของ Routing เพิ่มเติมนะครับ ดูไปดูมาน่าจะยาว ฝากติดตามกันด้วยนะครับ