ในการพัฒนาระบบ จะมีการเขียนโค้ดในรูปแบบเดียวกันซ้ำในหลายส่วนของระบบ เช่น การแสดงชื่อ-นามสกุลของผู้ใช้งาน การจัดรูปแบบวันที่ หรือการประมวลผลข้อมูลบางประเภท ส่งผลให้ต้องเสียเวลาในการพัฒนาและเพิ่มโอกาสเกิดข้อผิดพลาดเมื่อต้องมีการแก้ไขโค้ดในอนาคต ปัญหาดังกล่าวสามารถแก้ไขได้โดยสร้าง Method กลาง ใน Model เพื่อเรียกใช้งานจากส่วนต่างๆของระบบได้จากจุดเดียว ช่วยลดการเขียนโค้ดซ้ำ และดูแลการรักษาระบบในอนาคตได้ง่ายขึ้น
ตัวอย่าง
ตารางในฐานข้อมูล จะมีการแบ่งข้อมูลเป็นส่วนๆ เช่น คำนำหน้า ชื่อจริง และนามสกุล
หากไม่มีฟังก์ชันกลาง จะเขียนโค้ดซ้ำกันในหลายแห่ง เช่น
หน้า A
{{ $user->prefix . $user->firstname . ‘ ‘ . $user->lastname }}
หน้า B
{{ $user->prefix }}{{ $user->firstname }} {{ $user->lastname }}
หากในอนาคตต้องการเปลี่ยนรูปแบบการแสดงผล จะต้องเสียเวลาในการแก้ไขทุกหน้า อาจจะเกิดข้อผิดพลาดได้ง่าย
วิธีการแก้ไขปัญหาด้วยการสร้างฟังก์ชันกลางบน Model
ตัวอย่างการตั้งชื่อ Method ที่นิยมใช้ คือ get{ชื่อข้อมูล} เช่น getFullName() หรือ getStatusText() เพื่อให้เข้าใจหน้าที่ของ Method ได้ง่าย
รูปแบบการสร้าง Method แบบปกติ
get{ชื่อField}()
ตัวอย่าง
ภายในไฟล์ app/Models/User.php
class User extends Model
{
public function getFullName()
{
return $this->prefix . $this->firstname . ' ' . $this->lastname;
}
}
วิธีการเรียกใช้งาน
หลังจากสร้างฟังก์ชันกลางแล้ว สามารถเรียกใช้งานข้อมูลได้ทุกหน้า ดังนี้
{{ $user->getFullName() }}
หากเขียนบน Laravel ก่อนเวอร์ชัน 9 จะมีวิธีการสร้างฟังก์ชันอีกรูปแบบหนึ่ง
รูปแบบการเขียน Method แบบ Accessor
get{ชื่อField}Attribute()
ตัวอย่าง
class User extends Model
{
public function getFullNameAttribute()
{
return $this->prefix . $this->firstname . ' ' . $this->lastname;
}
}
Laravel จะสร้างข้อมูลชื่อ full_name ขึ้นมาให้ใช้งานอัตโนมัติ โดยไม่จำเป็นต้องมี Field full_name อยู่ในฐานข้อมูล และสามารถเรียกใช้งานได้โดยไม่ต้องใส่วงเล็บ () ต่อท้าย
วิธีการเรียกใช้งาน
{{ $user->full_name }}
ข้อดีในการสร้าง Method บน Model คือ
1. ลดการเขียนโค้ดซ้ำ
2. แก้ไขได้จากจุดเดียว
3. ลดความผิดพลาดในการพัฒนา
ในระบบขนาดใหญ่ ควรกำหนดรูปแบบการตั้งชื่อ Accessor ให้เป็นมาตรฐานเดียวกันภายในทีม เพื่อช่วยให้ผู้พัฒนาสามารถแยกความแตกต่างระหว่างคอลัมน์ในฐานข้อมูลและข้อมูลที่ถูกสร้างขึ้นจาก Model ได้ง่ายขึ้น