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

فهم Laravel Macros: الطريقة الأسهل لتوسيع Laravel
Laravel Macros واحدة من أقوى الميزات اللي بتخليك تضيف وظائف جديدة لكلاسات Laravel الأساسية بسهولة جدًا، بدون الحاجة للتعديل في الكود الأصلي أو استخدام الوراثة التقليدية في PHP. ببساطة، بتسمحلك تضيف ميثودز جديدة للكلاسات اللي بتدعم الماكروز، وتستخدمها كأنها جزء أصيل منها.
Table of contents [Show]
ليه ممكن نحتاج Laravel Macros؟
لو أول مرة تسمع عن Laravel Macros، ممكن تسأل: ليه أصلاً نستخدمها؟ وليه منلجأش للوراثة العادية (Inheritance)؟
تخيل إنك بتبني تطبيق بيعتمد بشكل كبير على تصدير البيانات كملفات CSV. طبيعي إن Laravel مش بيدعم الوظيفة دي بشكل مباشر، لأن دي حاجة متخصصة مش كل المشاريع بتحتاجها.
إزاي تعرف Laravel Macro؟
خطوة 1: التأكد إن الكلاس بيدعم Macros
مش كل الكلاسات في Laravel تقدر تضيف لها ماكروز، لازم تكون بتستخدم Trait اسمه Macroable
. أي كلاس بيحتوي على الـ Trait ده تقدر تضيف عليه ميثودز جديدة.
خطوة 2: تعريف الماكرو باستخدام macro
Laravel بيدينا ميثود macro
عشان نستخدمها في تسجيل الماكروز الجديدة. خلينا نضيف وظيفة تصدير البيانات كـ CSV:
use Illuminate\Http\Response;
Response::macro('csv', function ($headers, $rows) {
$output = fopen('php://output', 'w');
fputcsv($output, $headers);
foreach ($rows as $row) {
fputcsv($output, $row);
}
fclose($output);
});
خطوة 3: استخدام الماكرو في التطبيق
دلوقتي، بعد ما سجلنا الماكرو، نقدر نستخدمه بسهولة كأن Laravel بيجي بيه افتراضيًا:
return response()->csv(['Name', 'Email'], [
['Ahmed', 'ahmed@example.com'],
['Sara', 'sara@example.com']
]);
فين نحط Laravel Macros في المشروع؟
في Laravel تقدر تضيف الماكروز في أي مكان، بس من الأفضل تحطها في Service Provider عشان تضمن إنها بتتسجل قبل ما التطبيق يشتغل.
استخدام Mixin
لتجميع مجموعة من الماكروز
لو عندك أكتر من ماكرو وعايز تنظمهم بطريقة كويسة، تقدر تستخدم حاجة اسمها Mixin
. وهي عبارة عن كلاس بتجمع فيه مجموعة من الماكروز وتضيفها مرة واحدة لأي كلاس.
خطوة 1: إنشاء كلاس جديد لتجميع الماكروز
في app/Mixins
(لو المجلد مش موجود، أنشئه)، أضف ملف جديد ResponseMacros.php
:
namespace App\Mixins;
use Closure;
class ResponseMacros
{
public function csv(): Closure
{
return function ($headers, $rows) {
$output = fopen('php://output', 'w');
fputcsv($output, $headers);
foreach ($rows as $row) {
fputcsv($output, $row);
}
fclose($output);
};
}
}
إزاي Laravel Macros بتشتغل داخليًا؟
لو عندك فضول تعرف Laravel بيدير الماكروز إزاي، هتلاقي إن الـ Macroable
trait هو اللي مسؤول عن كل السحر ده.
Laravel بيستخدم مصفوفة $macros
داخل كل كلاس بيستخدم Macroable
عند تعريف أي ماكرو، بيتم تخزينه داخل المصفوفة باستخدام macro()
عند استدعاء أي ميثود مش موجودة، __call()
و __callStatic()
بيتدخلوا
الخلاصة
Laravel Macros بتسمحلك تضيف ميثودز جديدة لأي كلاس في Laravel بسهولة.
بتكون مفيدة لو محتاج تضيف دوال متخصصة زي تصدير البيانات أو تنسيق النصوص.
ممكن تضيف الماكروز داخل Service Provider أو تجمعها في Mixin
لتنظيم أكتر.
Laravel بيستخدم الـ Macroable
trait عشان يدير الماكروز داخليًا بطريقة ديناميكية.
دلوقتي دورك!
جرب تضيف ماكرو جديد في تطبيقك واستخدمه. 🚀