تكرار السؤال: …
الإجابة المختصرة
يمرر الطلب عبر سلسلة مغلفة بدوال Closures؛ والـ Terminable Middleware توفر دالة terminate($request, $response) تنفذ بعد إرسال الاستجابة للعميل.
الشرح
تعتمد الـ Middlewares على كلاس Illuminate\Pipeline\Pipeline. كل وسيط يستقبل $request ودالة $next؛ يمكنه فحص الطلب قبل استدعاء $next($request)، أو تعديل الاستجابة بعد عودتها. إذا كانت الـ Middleware تطبق دالة terminate()، يقوم Laravel باستدعائها بعد أن يكون العميل قد استلم الاستجابة بالكامل، مما يجعلها مثالية لمهام التسجيل (Logging) وجمع المقاييس دون تعطيل المستخدم.
مثال بالكود
class LogRequest {
public function handle($request, Closure $next) {
return $next($request);
}
public function terminate($request, $response): void {
// ينفذ بعد وصول الرد للمتصفح
Log::info("Request finished with code: " . $response->status());
}
}أخطاء شائعة
- تنفيذ عمليات طويلة داخل handle() بعد $next() بدلاً من استخدام دالة terminate().