العودة للمقالات
2026-07-07 Abdelrhman Yasser

Middleware في Laravel: من الصفر إلى الإنتاج

الوسائط في Laravel: تصفية الطلبات وهندسة الـ Pipeline

مدة القراءة: 25 دقيقة

مقدمة

الوسائط (Middleware) توفر آلية قوية لتصفية ومعالجة طلبات HTTP الواردة إلى تطبيقك. فكر فيها كسلسلة من الطبقات — كل طبقة يمكنها فحص الطلب أو تعديله أو رفضه قبل وصوله إلى التطبيق.

كيف تعمل الوسائط

العميل → الوسيط 1 → الوسيط 2 → الوسيط 3 → الراوتر/التحكم
العميل ← الوسيط 1 ← الوسيط 2 ← الوسيط 3 ← الراوتر/التحكم

كل وسيط يستقبل الطلب، ينفذ منطقه، ثم يستدعي $next($request) لتمريره للطبقة التالية.

إنشاء وسيط

php artisan make:middleware EnsureTokenIsValid
class EnsureTokenIsValid
{
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->header('X-API-Key') !== config('app.api_key')) {
            return response()->json(['error' => 'مفتاح API غير صالح'], 401);
        }
        return $next($request);
    }
}

وسيط قبل وبعد

// قبل — ينفذ قبل الوصول للتحكم
class BeforeMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        Log::info('بدأ الطلب', ['url' => $request->url()]);
        return $next($request);
    }
}

// بعد — ينفذ بعد استلام الرد من التحكم
class AfterMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        Log::info('اكتمل الطلب', ['status' => $response->status()]);
        return $response;
    }
}

تسجيل الوسائط

عامة (Global) — على كل طلب

مسار (Route) — على مسارات محددة

مجموعات (Groups) — مجموعة وسائط بمفتاح واحد

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'auth' => Authenticate::class,
        'role' => CheckRole::class,
        'throttle' => ThrottleRequests::class,
    ]);
})

وسائط بمعاملات

class CheckRole
{
    public function handle(Request $request, Closure $next, string ...$roles): Response
    {
        // التحقق من الدور
    }
}

// الاستخدام
Route::get('/admin', ...)->middleware('role:admin,super-admin');

تحديد معدل الطلبات (Rate Limiting)

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

الوسائط القابلة للإنهاء (Terminable)

تنفذ بعد إرسال الرد للمتصفح:

class TerminatingMiddleware
{
    public function terminate(Request $request, Response $response): void
    {
        Log::info('تم إنهاء الطلب بالكامل');
    }
}

أخطاء شائعة

  1. عمليات ثقيلة في وسائط عامة — كل طلب يدفع الثمن
  2. الاعتماد على الترتيب الخطأ — وسيط يعتمد على الجلسة قبل بدئها
  3. تجاهل CSRF في مسارات API

أفضل الممارسات

  1. استخدم الوسائط للاهتمامات المشتركة (المصادقة، التسجيل، CORS)
  2. اجعل الوسيط مركزاً — مسؤولية واحدة لكل وسيط
  3. استخدم مجموعات بدلاً من الوسائط العامة
  4. اختبر الوسائط بشكل منفرد

مقالات ذات صلة

# Laravel# PHP# Middleware# Security# Backend
WhatsApp
تواصل عبر واتساب