البرمجة

المسترجعات والمعدلات في Laravel

المسترجعات Accessors والمعدلات Mutators في Laravel: شرح شامل ومفصل

تُعتبر إطار العمل Laravel واحدًا من أشهر وأقوى أُطر العمل الخاصة بتطوير تطبيقات الويب باستخدام لغة PHP، حيث يوفر العديد من الأدوات والميزات التي تسهّل عملية بناء التطبيقات بشكل منظم وقابل للصيانة. ومن بين هذه الأدوات، تأتي المسترجعات (Accessors) والمعدلات (Mutators) كجزء أساسي من نظام ORM الخاص بـ Laravel، والمعروف باسم Eloquent ORM، الذي يُمكن المطورين من التعامل مع قواعد البيانات بطريقة أكثر سهولة ومرونة من خلال نماذج البيانات (Models).

في هذا المقال، سوف نستعرض بالتفصيل المفهوم الأساسي للمسترجعات والمعدلات في Laravel، أهمية استخدامها، كيفية تطبيقها، بالإضافة إلى أفضل الممارسات المرتبطة بها. سنغطي أيضًا أمثلة عملية وبرمجية لتوضيح كيفية الاستفادة منها في تطوير التطبيقات.


مفهوم المسترجعات Accessors

ما هي المسترجعات؟

المسترجعات هي دوال تُعرّف داخل نموذج الـ Eloquent، وتُستخدم لتحويل أو تعديل البيانات عند استرجاعها من قاعدة البيانات. بعبارة أخرى، كلما تم الوصول إلى خاصية معينة من خصائص النموذج، يتم تطبيق وظيفة المسترجع تلقائيًا قبل عرض القيمة للمستخدم أو الكود الذي يستدعي هذه الخاصية.

لماذا نستخدم المسترجعات؟

تُستخدم المسترجعات في حالات متعددة، منها:

  • تنسيق البيانات (مثل تحويل تاريخ مخزن بصيغة قاعدة بيانات إلى صيغة قابلة للقراءة).

  • إضافة مزايا مخصصة عند جلب القيم.

  • حماية البيانات الحساسة أو تعديل طريقة عرضها.

  • تهيئة القيم أو تحويلها تلقائيًا عند الاسترجاع دون الحاجة لتكرار الكود في كل مرة نحتاج فيها الوصول إلى القيمة.

كيفية تعريف المسترجعات في Laravel

في Laravel، يتم تعريف المسترجعات داخل نموذج الـ Eloquent بطريقة تسمى Accessor Naming Convention، التي تعتمد على صيغة معينة تسمى get{AttributeName}Attribute.

صيغة التعريف:

php
public function get{AttributeName}Attribute() { // تعديل أو تنسيق القيمة return $this->attributes['{attribute_name}']; }

مثال عملي على مسترجع Accessor

لنفترض أن لدينا نموذج مستخدم User يحتوي على خاصية first_name مخزنة في قاعدة البيانات، ونريد عرضها دائماً بأحرف كبيرة عند الاسترجاع.

php
class User extends Model { public function getFirstNameAttribute($value) { return strtoupper($value); } }

في هذا المثال، عند استدعاء خاصية first_name من كائن User، سيتم تلقائياً تحويل القيمة إلى أحرف كبيرة.


مفهوم المعدلات Mutators

ما هي المعدلات؟

المعدلات هي دوال تُعرّف داخل نموذج الـ Eloquent وتُستخدم لتعديل البيانات عند تعيين قيمة جديدة لخاصية معينة قبل حفظها في قاعدة البيانات. بمعنى آخر، كلما تم تعيين قيمة إلى خاصية من خصائص النموذج، يتم تمرير هذه القيمة عبر المعدل لمعالجتها أو تعديلها تلقائيًا.

أهمية استخدام المعدلات

  • حفظ البيانات في شكل معياري أو محدد (مثل تخزين كلمات المرور بعد تشفيرها).

  • التأكد من صحة وتنسيق القيم قبل التخزين.

  • تقليل التكرار في الكود لأن التعديلات تتم تلقائيًا عند كل تعيين.

  • التحكم في كيفية تخزين البيانات دون التأثير على باقي أجزاء الكود.

كيفية تعريف المعدلات في Laravel

يتم تعريف المعدلات بطريقة مشابهة للمسترجعات، ولكن بصيغة مختلفة تسمى set{AttributeName}Attribute.

صيغة التعريف:

php
public function set{AttributeName}Attribute($value) { $this->attributes['{attribute_name}'] = // تعديل القيمة قبل الحفظ; }

مثال عملي على معدل Mutator

على سبيل المثال، عند تعيين كلمة مرور مستخدم password، نريد أن يتم تشفيرها تلقائيًا باستخدام دالة bcrypt قبل الحفظ.

php
class User extends Model { public function setPasswordAttribute($value) { $this->attributes['password'] = bcrypt($value); } }

بهذا الشكل، عند تعيين قيمة password مثل:

php
$user->password = 'secret';

سيتم تخزين كلمة المرور مشفرة في قاعدة البيانات تلقائيًا.


الفرق بين المسترجعات Accessors والمعدلات Mutators

العامل المسترجعات Accessors المعدلات Mutators
التوقيت تُطبق عند استرجاع البيانات من قاعدة البيانات تُطبق عند تعيين البيانات قبل حفظها في قاعدة البيانات
الهدف تعديل أو تنسيق البيانات للعرض أو الاستخدام تعديل أو تهيئة البيانات قبل تخزينها
صيغة التعريف get{AttributeName}Attribute set{AttributeName}Attribute
مثال شائع تحويل نص إلى أحرف كبيرة عند العرض تشفير كلمة المرور قبل التخزين
تؤثر على القيم عند قراءة الخاصية كتابة الخاصية

استخدامات متقدمة للمسترجعات والمعدلات

المسترجعات Accessors متعددة القيم

يمكن أيضًا بناء مسترجعات تحسب قيمًا غير موجودة في قاعدة البيانات، مثل جمع اسم المستخدم الكامل من first_name و last_name:

php
public function getFullNameAttribute() { return $this->first_name . ' ' . $this->last_name; }

وهنا full_name ليست عمودًا في قاعدة البيانات لكنها تُعامل كخاصية في النموذج.

المعدلات Mutators مع أنواع بيانات مختلفة

عند التعامل مع حقول تواريخ، يمكن تحويل التاريخ إلى صيغة محددة قبل التخزين أو عند الاسترجاع:

php
public function setBirthDateAttribute($value) { $this->attributes['birth_date'] = \Carbon\Carbon::parse($value)->format('Y-m-d'); }

التعامل مع خصائص متعددة في نفس الوقت

يمكن الجمع بين المسترجعات والمعدلات لتحكم كامل في طريقة التعامل مع البيانات:

php
class User extends Model { public function getEmailAttribute($value) { return strtolower($value); } public function setEmailAttribute($value) { $this->attributes['email'] = strtolower($value); } }

أفضل الممارسات في استخدام المسترجعات والمعدلات

  1. عدم الإفراط في استخدامها: يجب أن تقتصر المسترجعات والمعدلات على المهام التي تتطلب تعديل أو تهيئة القيم، وليس لكل عملية تحويل أو تعديل بسيط يمكن تنفيذه في مكان آخر.

  2. الاحتفاظ بأداء التطبيق: تجنب العمليات المعقدة أو الثقيلة داخل المسترجعات والمعدلات لأنها تنفذ عند كل قراءة أو كتابة، ما قد يؤثر على أداء التطبيق.

  3. توثيق واضح: كتابة توثيق واضح للوظائف المستخدمة في المسترجعات والمعدلات لتسهيل الصيانة والتعديل لاحقًا.

  4. استخدام التسمية الصحيحة: الالتزام بصيغة التسمية في Laravel حتى تعمل الوظائف تلقائيًا بدون الحاجة لتسجيل أو تهيئة إضافية.

  5. التمييز بين الحقول الأصلية والحسابية: استخدام المسترجعات لإنشاء حقول حسابية افتراضية لا توجد في قاعدة البيانات ولكنها مهمة للتطبيق.


تأثير المسترجعات والمعدلات على الحفظ والاسترجاع في قاعدة البيانات

تتكامل المسترجعات والمعدلات بشكل سلس مع نظام Eloquent في Laravel بحيث يتم التعامل مع الحقول داخل النماذج وكأنها خصائص عادية، مما يخفف على المطور عناء التعامل مع تحويل البيانات يدويًا في كل مرة.

مثلاً، في حالة تعديل صيغة التاريخ أو تنسيق الأسماء، أو تشفير كلمات المرور، تكون هذه العمليات ضمنية ومشفرة داخل نموذج البيانات، وهذا يعزز قابلية إعادة استخدام الكود ويقلل الأخطاء.


مقارنة بين Laravel والمكتبات الأخرى في التعامل مع Accessors و Mutators

في أُطر عمل أخرى أو أنظمة ORM مختلفة مثل Doctrine في PHP، أو Active Record في Ruby on Rails، توجد مفاهيم مشابهة للمسترجعات والمعدلات، لكنها تختلف في التنفيذ أو التسمية. تميز Laravel يتمثل في البساطة والاعتماد على التسمية القياسية، مما يجعل التعلم واستخدام هذه الميزات سهلًا وواضحًا.


جدول يوضح أمثلة للمسترجعات والمعدلات

نوع الوظيفة الصيغة في Laravel مثال عملي الوظيفة
مسترجع Accessor get{AttributeName}Attribute($value) getFirstNameAttribute($value) تحويل القيمة إلى أحرف كبيرة عند الاسترجاع
معدل Mutator set{AttributeName}Attribute($value) setPasswordAttribute($value) تشفير كلمة المرور قبل الحفظ
مسترجع حسابي get{AttributeName}Attribute() getFullNameAttribute() جمع الاسم الأول والأخير في خاصية واحدة
معدل تنسيق set{AttributeName}Attribute($value) setBirthDateAttribute($value) تحويل صيغة التاريخ إلى yyyy-mm-dd قبل الحفظ

الخلاصة

المسترجعات والمعدلات في Laravel تشكلان أدوات قوية للتحكم في كيفية تعامل التطبيق مع البيانات سواء عند قراءتها أو كتابتها. بفضل هذه الأدوات، يمكن للمطورين تطبيق قواعد تحويل أو تنسيق البيانات ضمن نموذج الـ Eloquent بسهولة، مما يرفع جودة وأمان التطبيق ويقلل من الأخطاء البرمجية الناجمة عن التعامل اليدوي مع البيانات.

الاستثمار في فهم كيفية استخدام المسترجعات والمعدلات واتباع أفضل الممارسات يؤدي إلى بناء تطبيقات أكثر تنظيماً واحترافية، ويساعد في توفير وقت وجهد الصيانة مستقبلاً. بالإضافة إلى ذلك، تجعل هذه الأدوات من الكود أنظف وأقرب إلى مبادئ البرمجة الشيئية الحديثة، مما يجعل Laravel إطارًا رائدًا في تطوير تطبيقات PHP الحديثة.


المصادر والمراجع