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

یک کلاسی داریم به اسم UserService که داخلش متد ایجاد یوزر وجود داره. این کلاس برای کار کردن به کلاس دیگه ای نیاز داره. آفرین کلاس Database و Mailer!
Coupling شدید(یعنی کلاسها خیلی به هم وابستهان)
Test کردن سخت میشه
نمیتوانیم Database را Mock کنیم(Mock یعنی یک نسخه fake یا شبیهسازیشده از یک سرویس.)
برای رفع این اشکالات باید از Dependency Injection استفاده کنیم.
یعنی وابستگیهای یک کلاس را از بیرون به آن تزریق کنیم، نه اینکه خودش آنها را بسازه.
به عبارت دیگر:
کلاسها نباید وابستگیهای خود را ایجاد کنند، بلکه باید آنها را دریافت کنند.
بدون DI:

با DI:

فرقش رو دیدی؟ وابستگی از بیرون به کلاس تزریق میشه.
Constructor Injection: رایج ترین روش که در مثال بالا مشاهده کردیم. لاراول به صورت اتوماتیک PaymentGatewayرا میسازه.
Method Injection: وابستگی در متد تزریق میشه.
Property Injection: که کمتر مورد استفاده قرار میگیره.
بریم سراغ Service Container
Service Container در لاراول یک سیستم مدیریت وابستگیها هست که وظیفه ساخت و resolve کردن کلاسها را داره.
به آن میگویند:
IoC Container
Dependency Container
سه کار اصلی انجام میدهد:
1️⃣ ساخت object ها
2️⃣ مدیریت وابستگیها
3️⃣ تزریق dependency ها
یه مثال دیگه

وقتی میگیم:

لاراول این کارها را میکنه:
میبیند UserService چه dependency داره؟
میفهمه که Mailer نیاز است
Mailer را میسازه
آن را داخل constructor میگذاره
تو هسته لاراول یه کانینتر وجود داره که تو کل اپ ما استفاده میشه.
Illuminate\Container\Container
یه وقتایی پیش میاد لاراول نمیدونه دقیقا باید چی بسازه. مثلا وقتی از interface استفاده میکنیم.

و دو implementation داریم:
StripePayment
PaypalPayment

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

حالا هرجا PaymentGateway خواسته شود:
لاراول StripePayment را میسازه.
Service Provider جایی هست که همه bindingها، Serviceها و configuration داخلش ثبت میشن.
بهتره اینم بدونی
زمانی که درخواست HTTP میاد:
Route اجرا میشه
Controller ساخته میشه
Container constructor را بررسی میکنه
dependency ها resolve میشن
object ساخته میشه
امیدوارم براتون مفید بوده باشه✨