يا هلا بيك يا صديقي المبرمج في مقال جديد من سلسلة احتراف تطوير الويب (Web Development). تعال نتكلم النهاردة عن مشكلة كلنا بنمر بيها وإحنا شغالين على مشاريع لارفيل (Laravel)؛ وهي تكرار الكود. تخيل معايا إنك شغال على مشروع كبير، وعندك قايمة جانبية (Sidebar) أو الإشعارات (Notifications) أو يمكن بيانات السلة (Cart) في موقع إيكوميرس، والبيانات دي مطلوبة تظهر في كل صفحة تقريباً في الموقع.
الطريقة التقليدية والمنتشرة جداً عند المبتدئين هي إننا نروح لكل متحكم (Controller) ونقعد نجيب البيانات دي من قاعدة البيانات ونبعتها مع كل (View) راجع للمستخدم. النتيجة؟ كود مكرر في كل حتة (DRY Principle - Don't Repeat Yourself باظت خالص)، ولو حبيت تعدل حاجة صغيرة في جلب البيانات دي، هتضطر تلف على عشرات المتحكمات تعدلهم بايدك! وجع دماغ حقيقي صح؟
الحل السحري والمحترف للمشكلة دي هو استخدام مصممات العرض أو ما يُعرف باسم (View Composers). النهاردة هنشرح بالتفصيل إزاي تستخدم الميزة دي عشان تنظف كودك وتخلي تطبيق لارفيل أسرع وأكثر احترافية.
Table of contents [Show]
- 1 يعني إيه View Composers في لارفيل؟ (What is a View Composer)
- 2 الخطوة الأولى: إنشاء الـ View Composer Class
- 3 الخطوة الثانية: تسجيل الـ View Composer في الخدمة
- 4 الخطوة الثالثة: استخدام البيانات جوه ملفات الـ Blade
- 5 ليه لازم تستخدم View Composers في مشاريعك القادمة؟
- 6 نصيحة من أخ لتطوير مهاراتك البرمجية
يعني إيه View Composers في لارفيل؟ (What is a View Composer)
ببساطة شديدة، الـ (View Composer) هو عبارة عن دالة (Callback) أو كلاس (Class) بيتم استدعاؤه تلقائياً أول ما يتم رندر (Render) لـ (View) معين. الفكرة كلها إننا بنفصل عملية جلب البيانات عن المتحكمات (Controllers) ونحطها في مكان مركزي واحد.
يعني بدل ما تقول في كل (Controller):
return view('dashboard', ['notifications' => $notifications]);
إنت بتقول للارفيل: "يا سيدي، أول ما حد يطلب أي صفحة جوه مجلد الداشبورد، روح هاتي الإشعارات دي وحطها مع الصفحة دي لوحدك من غير ما أنا أقول لك في كل مرة". مريح جداً صح؟ تعال بقى نشوف الخطوات العملية للتنفيذ من خلال دروس البرمجة العملية (Tutorials).
الخطوة الأولى: إنشاء الـ View Composer Class
عشان نكتب كود نظيف وقابل للصيانة، الأفضل نعمل كلاس مخصص للـ (View Composer) بدل ما نكتب كل حاجة جوه ملف الـ (AppServiceProvider). الأول، ممكن نعمل مجلد جديد جوه الـ (app) وليكن اسمه (ViewComposers)، وجواه نعمل كلاس اسمه (NotificationComposer.php).
جوة الكلاس ده، هنكتب الكود المسؤول عن جلب البيانات بالشكل ده:
namespace App\ViewComposers;
use Illuminate\View\View;
use App\Models\Notification;
class NotificationComposer
{
public function compose(View $view)
{
// هنا بنجيب البيانات اللي محتاجينها
$notifications = Notification::latest()->take(5)->get();
// بنبعت البيانات للـ View
$view->with('notifications', $notifications);
}
}
زي ما انت شايف، الكلاس ده فيه دالة اسمها (compose) بتاخد كائن الـ (View) وتبعتله المتغير اللي اسمه (notifications) جاهز ومغلف.
الخطوة الثانية: تسجيل الـ View Composer في الخدمة
الخطوة اللي بعد كده هي إننا نعرف لارفيل إمتى وفين تستخدم الكلاس ده. هنروح على ملف اسمه (AppServiceProvider.php) الموجود في مسار (app/Providers)، وتحديداً جوه دالة الـ (boot).
هنستخدم (View Facade) عشان نربط الكلاس بتاعنا بالصفحات اللي محتاجينها:
use Illuminate\Support\Facades\View;
use App\ViewComposers\NotificationComposer;
public function boot()
{
// الطريقة الأولى: لو عايز تبعت البيانات لـ View معين بالذات
View::composer('admin.dashboard', NotificationComposer::class);
// الطريقة الثانية (الأشهر): لو عايز تبعت البيانات لمجموعة صفحات
View::composer(['admin.*', 'layouts.app'], NotificationComposer::class);
}
الجميل هنا في الـ (Wildcards) زي (admin.*) إنها بتقول للارفيل: "أي صفحة تبدأ بكلمة admin، ابعتلها البيانات دي تلقائياً". وبكده، أي متحكم هيعرض صفحة أدمن مش هيشيل هم الإشعارات نهائياً!
الخطوة الثالثة: استخدام البيانات جوه ملفات الـ Blade
دلوقتي، بعد ما عملنا الكلاس وسجلناه، تقدر تستخدم المتغير (notifications) جوه ملفات الـ (Blade Templates) بتاعتك بشكل طبيعي جداً كأن المتحكم هو اللي باعتته:
<div class="dropdown-menu">
@foreach($notifications as $notification)
<a href="#">{{ $notification->title }}</a>
@endforeach
</div>
بكل بساطة، الكود اتحفظ، وبقى نظيف جداً، ولو حبيت تغير مصدر الإشعارات دي في المستقبل، هترعدل في ملف واحد بس وهو (NotificationComposer) ومش هتضطر تلف على ولا متحكم تاني.
ليه لازم تستخدم View Composers في مشاريعك القادمة؟
1. فصل المسؤوليات (Separation of Concerns): المتحكم (Controller) دوره يستقبل الطلب (Request) ويعالجة ويرجع استجابة، مش دوره يجيب بيانات عامة زي القوائم والإشعارات.
2. كود أنظف وأسهل في القراءة (Clean Code): لما تفتح أي (Controller) هتلاقيه خفيف وصغير ومش مكرر فيه كود جلب البيانات.
3. سهولة التعديل (Maintainability): التعديل في مكان واحد بيوفر عليك وقت ومجهود كبير جداً، وبيقلل الأخطاء (Bugs) اللي ممكن تحصل بسبب نسيان تعديل مكان معين.
نصيحة من أخ لتطوير مهاراتك البرمجية
عشان تكون مبرمج لارفيل شاطر ومحترف، دايماً دور على الحاجات اللي بتخلي كودك (DRY). متكتبش كود مكرر أبدًا، ولو لقيت نفسك بتكرر كود جلب بيانات في أكتر من متحكم، اعرف فوراً إن فيه ميزة في لارفيل زي (View Composers) أو (Service Providers) أو حتى (Traits) مصممة خصيصاً عشان تحل المشكلة دي. اتعلم تقرأ التوثيق الرسمي (Laravel Documentation) لأنه مليان كنوز مخفية هتخليك تخلص شغل أسرع وبجودة أعلى بكتير. بالتوفيق يا بطل!