پنوشتههای یک برنامهنویس ناشی
🫂 @StartBevy
Post #461
714
فصل هفت - Services و Dependency Injection
بخش اول - سرویس کانتینر (قسمت چهارم)
Extending Bindings
گاهی اوقات شما میخواهید یک سرویس را که قبلاً در Service Container ثبت (bind) شده است، تغییر دهید یا چیزی به آن اضافه کنید. به جای اینکه کل آن را از نو بنویسید، میتوانید از متد extend استفاده کنید. این متد به شما اجازه میدهد تا سرویس اصلی را دریافت کرده، آن را تغییر دهید و سپس نسخه تغییریافته را برگردانید.
Resolving
متد make برای دریافت (resolve) یک نمونه از یک کلاس یا اینترفیس از Service Container استفاده میشود. هر زمان که شما به یک نمونه از کلاسی که در کانتینر ثبت شده نیاز دارید، میتوانید از این متد استفاده کنید.
فرض کنید یک کلاس برای مدیریت کاربران دارید.
تزریق خودکار (Automatic Injection)
لاراول به قدری هوشمند است که میتواند وابستگیهای (dependencies) یک کلاس را به صورت خودکار از روی Type-Hint در سازنده (constructor) یا متدهای آن تشخیص داده و آنها را تزریق کند. این یعنی در اکثر موارد شما نیازی به استفاده از متد make ندارید.
به جای اینکه در مثال قبل به صورت دستی UserManager را make کنیم، میتوانیم آن را به سازنده کنترلر تزریق کنیم.
در این حالت، لاراول به صورت خودکار UserManager را برای شما make کرده و به عنوان آرگومان به سازنده پاس میدهد.
فراخوانی متد و تزریق وابستگی (Method Invocation & Injection)
علاوه بر تزریق وابستگی در سازنده، لاراول میتواند وابستگیها را مستقیماً به متدهای کلاس نیز تزریق کند. این قابلیت به خصوص در کنترلرها بسیار مفید است، زمانی که یک وابستگی فقط در یک متد خاص مورد نیاز است.
فرض کنید یک سرویس برای اعتبارسنجی ورودیها دارید که فقط در متد store از آن استفاده میکنید.
رویدادهای کانتینر (Container Events)
Service Container هنگام دریافت (resolve) هر آبجکت، یک رویداد (event) را فراخوانی میکند. شما میتوانید به این رویداد گوش دهید تا هر زمان که یک آبجکت خاص از کانتینر گرفته شد، یک عملیات دلخواه را انجام دهید. این قابلیت برای دیباگ کردن یا اضافه کردن منطقهای خاص بسیار کاربردی است.
فرض کنید میخواهیم هر زمان که یک آبجکت از کلاس MyService ساخته شد، یک پیام در لاگ ثبت کنیم.
همچنین میتوانید به تمام resolving ها گوش دهید
Rebinding
گاهی اوقات شما نیاز دارید تا بعد از اینکه یک سرویس ساخته و استفاده شد، اگر دوباره bind شد، یک عملیات خاص را انجام دهید. برای مثال، فرض کنید یک سرویس دارید که به اطلاعات کاربر لاگین شده وابسته است. وقتی کاربر لاگ اوت کرده و یک کاربر دیگر لاگین میکند، شما نیاز دارید که این سرویس با اطلاعات کاربر جدید بهروزرسانی شود.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
بخش اول - سرویس کانتینر (قسمت چهارم)
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

