تكرار السؤال: …
الإجابة المختصرة
bind ينشئ نسخة جديدة تماماً مع كل استدعاء، وsingleton يحتفظ بنسخة واحدة طوال عمر التطبيق، بينما scoped يحتفظ بنسخة واحدة لكل طلب HTTP وتُفرغ مع الطلب التالي.
الشرح
الـ Service Container هو عقل Laravel لإدارة التبعيات. تستخدم bind للخدمات خفيفة الوزن أو عديمة الحالة. وتستخدم singleton للخدمات التي تتطلب اتصالات باهظة أو تحتفظ بحالة مشتركة. أضيفت scoped خصيصاً لبيئات الـ Long-Running (مثل Laravel Octane)؛ حيث يجب أن تشترك كل عمليات الطلب الواحد في نفس النسخة، مع ضمان إتلافها فور انتهاء الطلب وتفادي تسريب بيانات المستخدمين.
مثال بالكود
// نسخة جديدة مع كل طلب حل
$this->app->bind(Transactor::class, StripeTransactor::class);
// نسخة واحدة للأبد
$this->app->singleton(DatabaseConnection::class, fn() => new DatabaseConnection());
// نسخة واحدة لكل طلب HTTP
$this->app->scoped(CurrentTenant::class, fn() => new CurrentTenant());أخطاء شائعة
- استخدام singleton مع كائنات تحتفظ ببيانات مستخدم محدد في بيئات Laravel Octane.
أسئلة متابعة
- كيف يعزز Laravel Octane أداء التطبيقات وما هي مخاطر تسريب الحالة في الذاكرة (State Leaks)؟
- ما الفرق بين دالتي register() و boot() في Service Providers بـ Laravel ومتى تستخدم كلاً منهما؟