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('تم إنهاء الطلب بالكامل');
}
}
أخطاء شائعة
- عمليات ثقيلة في وسائط عامة — كل طلب يدفع الثمن
- الاعتماد على الترتيب الخطأ — وسيط يعتمد على الجلسة قبل بدئها
- تجاهل CSRF في مسارات API
أفضل الممارسات
- استخدم الوسائط للاهتمامات المشتركة (المصادقة، التسجيل، CORS)
- اجعل الوسيط مركزاً — مسؤولية واحدة لكل وسيط
- استخدم مجموعات بدلاً من الوسائط العامة
- اختبر الوسائط بشكل منفرد