Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 30: การสร้างและใช้ Mutators และ Accessors

Mutators และ Accessors ใน Laravel เป็นฟีเจอร์ที่ช่วยให้เราสามารถกำหนดรูปแบบข้อมูลที่ต้องการเก็บลงฐานข้อมูล (Mutator) และรูปแบบข้อมูลที่ต้องการดึงขึ้นมาแสดงผล (Accessor) ได้สะดวก โดยสามารถปรับแต่งค่าให้เป็นไปตามที่ต้องการโดยไม่จำเป็นต้องแก้ไขข้อมูลดิบในฐานข้อมูล

  • Mutator: ใช้สำหรับปรับแต่งข้อมูลก่อนที่จะถูกบันทึกลงในฐานข้อมูล
  • Accessor: ใช้สำหรับปรับแต่งข้อมูลก่อนที่จะถูกดึงขึ้นมาแสดงผล

การสร้าง Mutators และ Accessors

Laravel จะใช้วิธีการสร้างฟังก์ชันใน Model โดยตั้งชื่อตามรูปแบบ setAttributeNameAttribute สำหรับ Mutator และ getAttributeNameAttribute สำหรับ Accessor

ตัวอย่างการใช้งาน Mutator และ Accessor

สมมติว่าเรามี Model ชื่อ User และต้องการใช้ Mutator และ Accessor สำหรับฟิลด์ name และ email

  1. การสร้าง Mutator

ตัวอย่าง Mutator ที่แปลงค่า name ให้เป็นตัวอักษรพิมพ์ใหญ่ก่อนบันทึกลงฐานข้อมูล

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtoupper($value);
    }
}

ในตัวอย่างนี้ ฟังก์ชัน setNameAttribute จะถูกเรียกทุกครั้งที่มีการกำหนดค่า $user->name และค่าที่ได้รับ ($value) จะถูกแปลงเป็นตัวพิมพ์ใหญ่ก่อนบันทึกลงในฐานข้อมูล

$user = new User;
$user->name = 'john doe'; // ค่า name จะถูกแปลงเป็น 'JOHN DOE'
$user->save();

2. การสร้าง Accessor

ตัวอย่าง Accessor ที่แปลงค่า email ให้เป็นตัวอักษรพิมพ์เล็กทุกครั้งที่เรียกใช้

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function getEmailAttribute($value)
    {
        return strtolower($value);
    }
}

ในตัวอย่างนี้ ฟังก์ชัน getEmailAttribute จะถูกเรียกทุกครั้งที่มีการเรียกใช้ $user->email และจะแปลงค่าของ email เป็นตัวพิมพ์เล็กก่อนแสดงผล

$user = User::find(1);
echo $user->email; // แสดงค่า email ในรูปแบบตัวพิมพ์เล็ก

การใช้งานร่วมกันระหว่าง Mutators และ Accessors

Mutator และ Accessor สามารถใช้งานร่วมกันเพื่อควบคุมข้อมูลได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น:

  • ใช้ Mutator แปลงชื่อให้เป็นตัวพิมพ์ใหญ่ก่อนบันทึก
  • ใช้ Accessor แสดงชื่อที่มีการปรับแต่งเพิ่มเติมก่อนแสดงผล
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtoupper($value);
    }

    public function getNameAttribute($value)
    {
        return "Mr./Ms. " . ucfirst($value);
    }
}

Mutator: เปลี่ยนชื่อให้เป็นตัวพิมพ์ใหญ่ เช่น john doe จะถูกบันทึกเป็น JOHN DOE

Accessor: เพิ่ม “Mr./Ms.” ที่หน้า name เช่น JOHN DOE จะแสดงผลเป็น Mr./Ms. John doe

การนำไปใช้งาน

Mutators และ Accessors ช่วยให้เราสามารถจัดการข้อมูลใน Model ได้อย่างยืดหยุ่น สามารถควบคุมรูปแบบการบันทึกและแสดงผลข้อมูลได้ตามต้องการ โดยไม่ต้องทำการแปลงข้อมูลทุกครั้งที่เรียกใช้งาน ช่วยให้โค้ดมีความกระชับและง่ายต่อการบำรุงรักษา