خصم 20% على باقات تطوير المواقع
5 تريكات قوية في Laravel ترفع جودة الكود وتحسن أداء تطبيقك
لو بتشتغل بـ Laravel بشكل مستمر، فغالبًا أنت عارف إن قوة الفريمورك مش بس في الأدوات الكبيرة اللي بيوفرها، لكن كمان في التفاصيل الصغيرة اللي ممكن توفر عليك كمية كبيرة من الكود وتحسن أداء التطبيق بشكل واضح.
في المقال ده هنتكلم عن 5 تريكات عملية في Laravel أستخدمها كثيرًا في المشاريع الحقيقية، وخصوصًا عند التعامل مع Eloquent والاستعلامات والأداء.
الهدف مش إنك تحفظ مجموعة أوامر، لكن إنك تعرف إمتى تستخدم كل تقنية وليه.
1. استخدم Route Model Binding بدل البحث اليدوي عن البيانات
من أكثر الأشياء اللي بتخلي كود Laravel أنظف هي ميزة Route Model Binding.
بدل ما تستقبل ID داخل الـ Controller وبعدها تعمل Query يدويًا:
public function show($id)
{
$project = Project::findOrFail($id);
return view('projects.show', compact('project'));
}
يمكنك جعل Laravel يتولى عملية البحث تلقائيًا:
public function show(Project $project)
{
return view('projects.show', compact('project'));
}
مع Route بالشكل التالي:
Route::get('/projects/{project}', [ProjectController::class, 'show']);
هنا Laravel يفهم أن {project} مرتبط بـ Project Model، ويقوم بالبحث عن السجل تلقائيًا.
ولو لم يجد السجل، يتم التعامل مع الحالة تلقائيًا وإرجاع 404.
لماذا Route Model Binding مفيد؟
لأنه:
- يقلل كمية الكود.
- يجعل الـ Controller أنظف.
- يقلل تكرار
findOrFail(). - يجعل الـ Routes والـ Controllers أكثر وضوحًا.
- يستفيد من إمكانيات Laravel الأصلية بدل كتابة Logic متكرر.
ويمكنك أيضًا استخدام Custom Route Key، مثل الاعتماد على slug بدل id، وهو أمر مفيد جدًا في المواقع التي تهتم بالـ SEO.
2. استخدم Eager Loading لتجنب مشكلة N+1
دي من أهم النقاط التي يجب أن يهتم بها أي مطور Laravel.
لنفترض أن لديك Projects وكل Project مرتبط بـ Client:
$projects = Project::all();
foreach ($projects as $project) {
echo $project->client->name;
}
الكود يبدو طبيعيًا، لكنه قد يؤدي إلى تنفيذ عدد كبير من الاستعلامات.
فأنت تجلب الـ Projects أولًا، وبعد ذلك قد يقوم Laravel بتنفيذ Query إضافي لكل Client يتم الوصول إليه.
وهنا تظهر مشكلة N+1 Queries.
الحل هو استخدام Eager Loading:
$projects = Project::with('client')->get();
وإذا كان لديك أكثر من علاقة:
$projects = Project::with([
'client',
'category',
'services',
'images',
])->get();
بهذه الطريقة تخبر Laravel أنك تحتاج إلى العلاقات مسبقًا، وبالتالي يمكن تقليل عدد الاستعلامات بشكل كبير.
مثال عملي
لو كان لديك صفحة تعرض المشاريع:
$projects = Project::with([
'category',
'client',
'images',
])
->latest()
->paginate(12);
هذا أفضل بكثير من جلب المشاريع ثم ترك كل علاقة يتم تحميلها بشكل منفصل أثناء عرض الصفحة.
نصيحة مهمة
لا تستخدم with() بشكل عشوائي مع كل العلاقات الموجودة في Model.
حمّل فقط العلاقات التي تحتاجها في الصفحة الحالية، لأن تحميل بيانات كثيرة بدون حاجة قد يؤدي هو الآخر إلى استهلاك الذاكرة وزيادة حجم البيانات.
3. استخدم when() لبناء Queries بشكل نظيف
من أكثر الأكواد التي تتكرر في صفحات البحث والفلاتر:
$query = Project::query();
if ($request->category) {
$query->where('category_id', $request->category);
}
if ($request->status) {
$query->where('status', $request->status);
}
$projects = $query->get();
الكود صحيح، لكنه يبدأ في التحول إلى شيء مزعج عندما يكون لديك عدد كبير من الفلاتر.
يمكنك استخدام when():
$projects = Project::query()
->when($request->category, fn ($query, $category) =>
$query->where('category_id', $category)
)
->when($request->status, fn ($query, $status) =>
$query->where('status', $status)
)
->get();
والميزة تظهر أكثر مع البحث:
$projects = Project::query()
->when($request->search, fn ($query, $search) =>
$query->where('title', 'like', "%{$search}%")
)
->latest()
->paginate(20);
هنا يتم تنفيذ شرط البحث فقط إذا كانت قيمة search موجودة.
لماذا أحب استخدام when()؟
لأنها تجعل Query Builder أكثر مرونة، خصوصًا في:
- صفحات البحث.
- الفلاتر.
- لوحات التحكم.
- التقارير.
- APIs.
- أنظمة ERP.
- المتاجر الإلكترونية.
وبدل ما يكون الـ Controller مليئًا بعشرات if، يصبح الاستعلام نفسه واضحًا وسهل القراءة.
4. استخدم Query Scopes لتجميع الـ Business Logic
لو عندك Query متكرر في أكثر من مكان، فلا يوجد سبب لكتابته مرة أخرى.
مثلًا:
Project::where('status', 'active')->get();
لو كنت تستخدم هذا الاستعلام في أكثر من Controller أو Service، يمكنك إنشاء Local Scope داخل Model:
public function scopeActive($query)
{
return $query->where('status', 'active');
}
وبعدها:
$projects = Project::active()->get();
ويمكنك بناء Scopes أخرى:
public function scopePublished($query)
{
return $query->where('published', true);
}
وبالتالي:
$projects = Project::active()
->published()
->latest()
->get();
وهنا تبدأ الـ Models في التعبير عن منطق التطبيق بشكل أفضل.
بدل:
where('status', 'active')
where('published', true)
أنت أصبحت تكتب:
active()
published()
وهو كود أسهل في القراءة والفهم.
مثال أكثر واقعية
في مشروع يحتوي على مشاريع مميزة:
public function scopeFeatured($query)
{
return $query->where('is_featured', true);
}
يمكنك ببساطة:
$projects = Project::active()
->published()
->featured()
->latest()
->take(6)
->get();
وهذا النوع من التنظيم يكون مفيدًا جدًا عندما يكبر المشروع.
5. استخدم Cache عندما تكون البيانات لا تتغير باستمرار
آخر تريك، وربما من أكثر الأشياء تأثيرًا على الأداء، هو استخدام Cache بالشكل الصحيح.
لنفترض أن الصفحة الرئيسية تعرض قائمة الخدمات:
$services = Service::active()->get();
لو الصفحة يتم زيارتها آلاف المرات، فأنت لا تحتاج بالضرورة إلى تنفيذ نفس Query في كل Request.
يمكنك استخدام:
$services = Cache::remember(
'services',
now()->addHours(6),
fn () => Service::active()->get()
);
في أول Request سيتم تنفيذ Query وتخزين النتيجة في Cache.
الطلبات التالية يمكنها الحصول على البيانات من الـ Cache بدل تنفيذ Query جديدة في قاعدة البيانات.
مثال أكثر واقعية
لو الصفحة الرئيسية تعرض أحدث المشاريع:
$projects = Cache::remember(
'homepage.projects',
now()->addHour(),
fn () => Project::with([
'category',
'images',
])
->active()
->latest()
->take(6)
->get()
);
هنا جمعنا أكثر من تقنية معًا:
- Eager Loading
- Query Scope
- Sorting
- Limiting
- Caching
وهذا هو النوع من التفكير الذي يجعل Laravel Application أسرع وأكثر تنظيمًا.
ولكن متى يجب حذف الـ Cache؟لو تم تعديل الخدمات مثلًا، فمن المهم تحديث أو حذف الـ Cache المرتبط بها.
يمكنك استخدام:
Cache::forget('services');
وبالتالي في الزيارة التالية سيتم تنفيذ Query جديدة وتخزين البيانات الجديدة.
وفي التطبيقات الكبيرة، يمكن تنظيم الـ Cache Keys بعناية، واستخدام Events أو Observers أو Services لإدارة تحديث الـ Cache بدل توزيع Cache::forget() في أماكن كثيرة.
وهذه نقطة مهمة جدًا.
لو عندك Query سيئة مثل:
Project::where('title', 'like', '%laravel%')->get();
فلا تجعل الحل الوحيد هو:
Cache::remember(...)
الأفضل أن تسأل أولًا:
هل Query نفسها جيدة؟
هل يوجد Index مناسب؟
هل تستخدم Pagination؟
هل تحتاج كل الأعمدة؟
هل تحتاج كل النتائج؟
هل هناك N+1؟
هل العلاقات يتم تحميلها بشكل صحيح؟
الـ Cache ممتاز، لكنه ليس بديلًا عن تصميم Query وDatabase بشكل جيد.
الخلاصةLaravel يوفر لك الكثير من الأدوات التي تسمح لك بكتابة كود أقل، أوضح، وأفضل أداءً.
والـ 5 تريكات التي تناولناها اليوم هي:
- Route Model Binding لتقليل الكود المتكرر داخل Controllers.
- Eager Loading لتجنب مشكلة N+1 وتحسين التعامل مع العلاقات.
- when() لبناء Queries ديناميكية بطريقة نظيفة.
- Query Scopes لتنظيم الـ Business Logic وإعادة استخدام الاستعلامات.
- Cache لتقليل الضغط على قاعدة البيانات وتحسين سرعة التطبيق.
والأهم من معرفة هذه الأدوات هو معرفة متى تستخدم كل واحدة منها.
في مشاريع Laravel الكبيرة، تحسين الأداء لا يأتي عادةً من تريك واحد، وإنما من مجموعة قرارات صغيرة صحيحة في الـ Database والـ Eloquent والـ Cache والـ Application Architecture.
إذا كنت تعمل على Laravel بشكل احترافي، فابدأ بمراجعة الاستعلامات الموجودة في مشروعك، وابحث تحديدًا عن N+1 Queries والاستعلامات المتكررة والبيانات التي يمكن تخزينها مؤقتًا.
قسم المقالة
5 تريكات قوية في Laravel ترفع جودة الكود وتحسن أداء تطبيقك
اكتشف 5 تريكات عملية في Laravel تساعدك على كتابة كود أنظف وأكثر كفاءة، بداية من Route Model Binding وEager Loading، مرورًا بـ Query Scopes وwhen()، وصولًا إلى استخدام Cache لتحسين أداء تطبيقات Laravel وتقليل الاستعلامات غير الضرورية.
التواصل والاستشارة
تواصل مباشر عبر الواتساب أو الهاتف لفهم احتياجات مشروعك بدقة.
التخطيط والجدولة
وضع خطة عمل واضحة مع جدول زمني محدد لكل مرحلة من المشروع.
البرمجة والتطوير
تطوير المشروع بأحدث التقنيات لضمان الأداء والأمان العاليين.
المراجعة والتسليم
ختبار شامل ومراجعة دقيقة قبل التسليم النهائي للمشروع.
تخصصات ذات صلة بالمقال
كل الخدماتخدمات مرتبطة بالمقال
كل الخدماتهل تريد تطبيق ما ورد في هذا المقال على مشروعك؟
إذا كان هذا الموضوع مرتبطًا بمشروعك الحالي، يمكنك الانتقال مباشرة إلى إحدى الخدمات المناسبة أعلاه أو تصفح صفحة الخدمات لاختيار الحل الأنسب.