ویرگول
ورودثبت نام
3tayesh.mp
3tayesh.mpکد می‌زنم، اشتباه می‌کنم، یاد می‌گیرم؛
3tayesh.mp
3tayesh.mp
خواندن ۲ دقیقه·۹ روز پیش

درک Service Container و Dependency Injection

DI و Service Container ستون فقرات لاراول حساب میشن. برای اینکه این دو رو کامل یاد بگیریم از پایه شروع میکنیم. به کد پایین دقت کن:

یک کلاسی داریم به اسم UserService که داخلش متد ایجاد یوزر وجود داره. این کلاس برای کار کردن به کلاس دیگه ای نیاز داره. آفرین کلاس Database و Mailer!

حالا اشکال این کد چیه؟ بیا بررسی کنیم

  • Coupling شدید(یعنی کلاس‌ها خیلی به هم وابسته‌ان)

  • Test کردن سخت می‌شه

  • نمی‌توانیم Database را Mock کنیم(Mock یعنی یک نسخه fake یا شبیه‌سازی‌شده از یک سرویس.)

برای رفع این اشکالات باید از Dependency Injection استفاده کنیم.

یعنی وابستگی‌های یک کلاس را از بیرون به آن تزریق کنیم، نه اینکه خودش آن‌ها را بسازه.

به عبارت دیگر:

کلاس‌ها نباید وابستگی‌های خود را ایجاد کنند، بلکه باید آن‌ها را دریافت کنند.

بدون DI:

با DI:

فرقش رو دیدی؟ وابستگی از بیرون به کلاس تزریق میشه.

سه نوع DI داریم

  • Constructor Injection: رایج ترین روش که در مثال بالا مشاهده کردیم. لاراول به صورت اتوماتیک PaymentGatewayرا می‌سازه.

  • Method Injection: وابستگی در متد تزریق می‌شه.

  • Property Injection: که کمتر مورد استفاده قرار میگیره.

بریم سراغ Service Container

Service Container در لاراول یک سیستم مدیریت وابستگی‌ها هست که وظیفه ساخت و resolve کردن کلاس‌ها را داره.

به آن می‌گویند:

  • IoC Container

  • Dependency Container

کار Service Container

سه کار اصلی انجام می‌دهد:

1️⃣ ساخت object ها

2️⃣ مدیریت وابستگی‌ها

3️⃣ تزریق dependency ها

یه مثال دیگه

وقتی میگیم:

لاراول این کارها را می‌کنه:

  1. می‌بیند UserService چه dependency داره؟

  2. می‌فهمه که Mailer نیاز است

  3. Mailer را می‌سازه

  4. آن را داخل constructor می‌گذاره

اصلا سرویس کانتینر چجوری کار میکنه؟

تو هسته لاراول یه کانینتر وجود داره که تو کل اپ ما استفاده میشه.

Illuminate\Container\Container

یه وقتایی پیش میاد لاراول نمیدونه دقیقا باید چی بسازه. مثلا وقتی از interface استفاده میکنیم.

و دو implementation داریم:

  • StripePayment

  • PaypalPayment

الان لاراول گیج میشه نمیدونه کدوم کلاس رو باید بسازه. میایم با Binding(اتصال داده) این مشکل رو رفع میکنیم. حالا بگو چجوری؟ با تعریف کردن در Service Provider

حالا هرجا PaymentGateway خواسته شود:

لاراول StripePayment را می‌سازه.

Service Provider جایی هست که همه bindingها، Serviceها و configuration داخلش ثبت میشن.

بهتره اینم بدونی

چرخه Dependency Injection در لاراول

زمانی که درخواست HTTP میاد:

  1. Route اجرا می‌شه

  2. Controller ساخته می‌شه

  3. Container constructor را بررسی می‌کنه

  4. dependency ها resolve می‌شن

  5. object ساخته می‌شه

امیدوارم براتون مفید بوده باشه✨

dependency injectionلاراولlaravelبرنامه نویسی
۶
۰
3tayesh.mp
3tayesh.mp
کد می‌زنم، اشتباه می‌کنم، یاد می‌گیرم؛
شاید از این پست‌ها خوشتان بیاید