TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #461 714
فصل هفت - Services و Dependency Injection

بخش اول - سرویس کانتینر (قسمت چهارم)

‏
‏Extending Bindings‏

گاهی اوقات شما می‌خواهید یک سرویس را که قبلاً در Service Container ثبت (bind) شده است، تغییر دهید یا چیزی به آن اضافه کنید. به جای اینکه کل آن را از نو بنویسید، می‌توانید از متد extend استفاده کنید. این متد به شما اجازه می‌دهد تا سرویس اصلی را دریافت کرده، آن را تغییر دهید و سپس نسخه تغییریافته را برگردانید.
$this->app->singleton(ApiClient::class, function () {
return new ApiClient();
});

$this->app->extend(ApiClient::class, function ($client, $app) {
$client->config['timeout'] = 10;
return $client;
});


‏Resolving

متد make برای دریافت (resolve) یک نمونه از یک کلاس یا اینترفیس از Service Container استفاده می‌شود. هر زمان که شما به یک نمونه از کلاسی که در کانتینر ثبت شده نیاز دارید، می‌توانید از این متد استفاده کنید.
فرض کنید یک کلاس برای مدیریت کاربران دارید.
$this->app->bind('UserManager', function ($app) {
return new UserManager();
});

// Resolving
$userManager = app()->make('UserManager');


تزریق خودکار (Automatic Injection)

لاراول به قدری هوشمند است که می‌تواند وابستگی‌های (dependencies) یک کلاس را به صورت خودکار از روی Type-Hint در سازنده (constructor) یا متدهای آن تشخیص داده و آن‌ها را تزریق کند. این یعنی در اکثر موارد شما نیازی به استفاده از متد make ندارید.

به جای اینکه در مثال قبل به صورت دستی UserManager را make کنیم، می‌توانیم آن را به سازنده کنترلر تزریق کنیم.
public function __construct(UserManager $userManager)
{
$this->userManager = $userManager;
}

در این حالت، لاراول به صورت خودکار UserManager را برای شما make کرده و به عنوان آرگومان به سازنده پاس می‌دهد.

فراخوانی متد و تزریق وابستگی (Method Invocation & Injection)

علاوه بر تزریق وابستگی در سازنده، لاراول می‌تواند وابستگی‌ها را مستقیماً به متدهای کلاس نیز تزریق کند. این قابلیت به خصوص در کنترلرها بسیار مفید است، زمانی که یک وابستگی فقط در یک متد خاص مورد نیاز است.

فرض کنید یک سرویس برای اعتبارسنجی ورودی‌ها دارید که فقط در متد store از آن استفاده می‌کنید.
public function store(Request $request, UserValidator $validator)
{
// Request and UserValidator injected.
}


رویدادهای کانتینر (Container Events)

‏‌‎Service Container هنگام دریافت (resolve) هر آبجکت، یک رویداد (event) را فراخوانی می‌کند. شما می‌توانید به این رویداد گوش دهید تا هر زمان که یک آبجکت خاص از کانتینر گرفته شد، یک عملیات دلخواه را انجام دهید. این قابلیت برای دیباگ کردن یا اضافه کردن منطق‌های خاص بسیار کاربردی است.

فرض کنید می‌خواهیم هر زمان که یک آبجکت از کلاس MyService ساخته شد، یک پیام در لاگ ثبت کنیم.
$this->app->resolving(MyService::class, function ($service, $app) {
Log::info('MyService resolved!');
});

همچنین می‌توانید به تمام resolving ها گوش دهید
$this->app->resolving(function ($object, $app) {
Log::info('Resolved: ' . get_class($object));
});


‏Rebinding

گاهی اوقات شما نیاز دارید تا بعد از اینکه یک سرویس ساخته و استفاده شد، اگر دوباره bind شد، یک عملیات خاص را انجام دهید. برای مثال، فرض کنید یک سرویس دارید که به اطلاعات کاربر لاگین شده وابسته است. وقتی کاربر لاگ اوت کرده و یک کاربر دیگر لاگین می‌کند، شما نیاز دارید که این سرویس با اطلاعات کاربر جدید به‌روزرسانی شود.
$this->app->rebinding('UserData', function ($app, $instance) {
// logic
});


#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
  • ❤ 7
  • 🍓 2
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →