Featured image of post ما هي الاختلافات المنطقية بين bind() و singleton() و scoped() و instance() في Laravel؟ وفي أي سيناريوهات يمكن استخدامها؟

ما هي الاختلافات المنطقية بين bind() و singleton() و scoped() و instance() في Laravel؟ وفي أي سيناريوهات يمكن استخدامها؟

ما هي الاختلافات المنطقية بين bind() و singleton() و scoped() و instance() في Laravel؟ وفي أي سيناريوهات يمكن استخدامها؟

مقارنة بين طرق ربط الكائنات في حاوية خدمات Laravel

الطريقة bind() singleton() scoped() instance()
الوصف تنشئ نسخة جديدة في كل مرة يتم فيها حلها. تنشئ نسخة واحدة فقط وتعيد نفس النسخة في الطلبات اللاحقة. تنشئ نسخة واحدة فقط ضمن كل دورة حياة طلب/وظيفة؛ ويتم مسحها بعد انتهاء الطلب. تربط نسخة موجودة بالحاوية وتعيد تلك النسخة في كل مرة يتم حلها.
الإيجابيات - نسخة جديدة لكل طلب، لا توجد مشاكل في مشاركة الحالة
- استخدام نظيف للذاكرة
- مناسبة للمنطق الذي يتطلب حالة مستقلة
- يمكن توفير تكوين فريد لكل طلب
- توفر موارد النظام عن طريق إنشاء نسخة مرة واحدة فقط
- تضمن اتساق الحالة
- مناسبة لمشاركة التكوين والموارد
- أداء أفضل في حالات التزامن العالي
- توازن بين استخدام الذاكرة ومشاركة الحالة
- تشارك الحالة داخل الطلب ولكنها معزولة بين الطلبات
- مناسبة لسيناريوهات طلب الويب
- تحكم كامل في توقيت إنشاء النسخة
- يمكن تكوين حالة النسخة مسبقًا
- مناسبة للخدمات التي تتطلب تكوينًا محددًا
السلبيات - تتطلب المزيد من موارد النظام لتكرار إنشاء النسخ
- قد تؤثر على الأداء تحت التزامن العالي
- غير مناسبة للسيناريوهات التي تتطلب حالة مشتركة
- قد تسبب مشاكل في الأداء لأنه يتم إنشاء نسخة جديدة في كل مرة.
- الحالة المشتركة قد تؤدي إلى أخطاء يصعب تتبعها
- غير مناسبة للسيناريوهات التي تتطلب حالة مستقلة
- يستمر استخدام الذاكرة حتى انتهاء البرنامج
- تتطلب الاختبارات اهتمامًا خاصًا بإعادة تعيين الحالة
- إذا كانت النسخة تحتفظ بالحالة، فقد يؤدي ذلك إلى سلوك غير متوقع.
- قد تسبب مشاكل في المهام طويلة الأمد
- تتطلب فهم دورة حياة الطلب
- غير مناسبة لأوامر CLI
- أقل مرونة
- لا يمكن تعديل تكوين النسخة ديناميكيًا
- قد تشغل الذاكرة عند بدء التشغيل
- غير مناسبة للحالات التي تتطلب التحميل الكسول أو نسخ متعددة.
حالة الاستخدام للخدمات قصيرة الأمد أو الفئات التي تتطلب حالة مستقلة. للخدمات المشتركة عالميًا، مثل المسجلات أو مديري التكوين. للخدمات التي تحتاج إلى الحفاظ على الحالة داخل الطلب ولكن لا تريد ذلك عبر الطلبات، مثل اتصالات قاعدة البيانات. عندما يكون لديك نسخة بالفعل وتريد إعادة استخدامها، مثل كائن تكوين مشترك.
مثال عندما يكون لديك فئة Product وتريد إنشاء نسخة Product جديدة في كل مرة يتم طلب بيانات منتج مختلفة. عندما يكون لديك فئة Logger وتريد أن تستخدم جميع عمليات كتابة السجل نفس النسخة للحفاظ على الاتساق. عندما يكون لديك فئة ShoppingCart وتحتاج إلى مشاركة حالة عربة التسوق داخل نفس الطلب. عندما يكون لديك فئة DatabaseConfig وتحتاج إلى تعيين معلمات الاتصال عند بدء تشغيل التطبيق.

أمثلة

استخدام bind()

$this->app->bind('Product', function () {
 return new Product();
});

في كل مرة يتم استدعاء app('Product')، تعيد نسخة Product جديدة.

استخدام singleton()

$this->app->singleton('Logger', function () {
 return new Logger();
});

في كل مرة يتم استدعاء app('Logger')، تعيد نفس نسخة Logger.

استخدام scoped()

$this->app->scoped(Transistor::class, function (Application $app) {
    return new Transistor($app->make(PodcastParser::class));
});

تشارك نفس النسخة داخل دورة حياة الطلب نفسها؛ الطلبات المختلفة ستنشئ نسخًا جديدة.

استخدام instance()


$service = new Transistor(new PodcastParser);
 
$this->app->instance(Transistor::class, $service);

تربط نسخة موجودة مباشرة بالحاوية.

ملخص

يمكن تطبيق Laravel حاليًا في العديد من أنواع السيناريوهات المختلفة، مثل طلبات الويب، وأوامر CLI، ووظائف قائمة الانتظار، وأوامر وحدة التحكم، وما إلى ذلك.

لذا، عند اختيار طريقة الربط التي ستستخدمها، تحتاج إلى النظر في احتياجات الخدمة في السيناريوهات المختلفة، وما إذا كنت بحاجة إلى مشاركة الحالة أو التكوين.

Reference

All rights reserved,未經允許不得隨意轉載
مبني بستخدام Hugo
قالب Stack مصمم من Jimmy