แนวทางลดการเขียนโค้ดซ้ำใน Laravel ด้วยการสร้าง Method บน Model

ในการพัฒนาระบบ จะมีการเขียนโค้ดในรูปแบบเดียวกันซ้ำในหลายส่วนของระบบ เช่น การแสดงชื่อ-นามสกุลของผู้ใช้งาน การจัดรูปแบบวันที่ หรือการประมวลผลข้อมูลบางประเภท ส่งผลให้ต้องเสียเวลาในการพัฒนาและเพิ่มโอกาสเกิดข้อผิดพลาดเมื่อต้องมีการแก้ไขโค้ดในอนาคต ปัญหาดังกล่าวสามารถแก้ไขได้โดยสร้าง 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 ได้ง่ายขึ้น

ผู้เขียน